2017-06-20 63 views
0

我想根据标记来变换输入字符串。从字符串中删除一串非特定字符的方法

因此,("Hail Mary #Run quick see\ncd!sawce", ["#", "!"])将删除标记后面的所有字符,但直到反斜杠或字符串结束。

该案将成为("Hail Mary #Run quick see\ncd!sawce", ["#", "!"])

Hail Mary cd

我写了这个:

def solution(string, markers): 
    orig = string.strip() 
    wholeList = [] 
    newString = orig 
    for char in orig: 
     for j in markers: 
      if char == j: 
       i = orig.index(char) 
       newString = orig[:i].strip() 
       wholeList.append(newString) 
     if char == "\\": 
      i = orig.index(char) 
      orig = orig[i:] 

return "".join(wholeList) 
+1

这对于正则表达式很简单。 – Barmar

+0

为什么它保留'\ ncd'?这里没有反斜杠,这是一个换行符。 – Barmar

+1

为什么*#之前的空格不包含在输出中? – trincot

回答

3

首先,你需要逃避你反斜线,如果你打算在y中有字面反斜杠我们的字符串。

然后,您可以使用正则表达式替换:

import re 
s = "Hail Thor #Run quick see\\ncd!sawce" 
print(re.sub(r"[#!].*?(?=[\\]|$)", "", s)) # Hail Thor \ncd 

如果你打算有一个换行符\n,你想去除去,直到下一个换行符,那么它是更容易,如默认.不匹配换行符:

import re 
s = "Hail Thor #Run quick see\ncd!sawce" 
print(re.sub(r"[#!].*", "", s)) # Hail Thor 
            # cd 
+0

或使用原始字符串。 – Barmar

+0

事实上,这也可以发挥作用:'r'Hail Thor #Run快看\ ncd!sawce“'。 – trincot

+0

在这个问题中,我不想改变输入。如果用户输入一个换行符,那么我想包含该元素后面的字符。 – Enesxg

0

虽然我会@trincot同意使用正则表达式,我做了一个替代解决方案:

def solution(text, markers): 
    # If all the markers are used or 
    # there are no markers return text 
    if len(markers) < 1: 
     return text.strip() 
    else: 
     # Get the first marker 
     marker = markers.pop(0) 
     # Split the string with the marker 
     before, after = text.split(marker) 
     # Split the remaining string at a newline 
     after = after.split("\n", 1) 
     if len(after) > 1: 
      end = "\n" + after[-1] 
     else: 
      end = "" 
     text = before.strip() + end 
     return solution(text, markers)