在特定字符之前重复python正则表达式
我想要获取所有的文本,直到出现一个感叹号(!)。比如说:
some textwfwfdsfosjtortjk\n
sdsfsdfsdfsdfsdfsdfsdfsfsfsdfsdfsdf\n
sfsgdfgdfgdgdfgdg\n
!
在感叹号之前的行数是变化的,所以我不能像这样写一个固定的正则表达式。
"+\n^.+\n^.+"
我正在使用re.MULTLINE这个选项,但我应该使用re.DOTALL吗?
谢谢!
7 个回答
1
根据Python的一个理念“先做再说”(EAFP),我建议你写一个简单易懂的子程序,这样如果你需要更改分隔符时,维护起来会比较方便。
SEPARATOR = u"!"
def process_string(s):
try:
return s[:s.index(SEPARATOR)]
except ValueError:
return s
这个函数会返回从字符串开始到你定义的分隔符之前的部分。如果找不到分隔符,它会返回整个字符串。这个函数在处理换行符时也能正常工作。如果你的分隔符改变了,只需要简单地修改SEPARATOR
就可以了。
当你请求一个字符串中不存在的字符的索引时,会抛出ValueError
这个异常(你可以在命令行试试:"Hola".index("1")
,会抛出ValueError: substring not found
)。这个工作流程假设你大多数情况下都希望SEPARATOR
字符在字符串中,所以你先尝试去找它,而不去询问(也就是不先检查SEPARATOR
是否在字符串中);如果找不到(index
方法抛出ValueError
),那么你就“请求原谅”(返回原始的字符串)。这种方法(EAFP)在适用时被认为是符合Python风格的,就像在这个例子中一样。
不需要使用正则表达式;这只是一个简单的问题。
3
你想要从输入的开头开始匹配,直到第一个!
字符,但不包括这个字符,对吧?这样做就可以:
re.match(r'[^!]*', input)
如果没有感叹号,这个匹配会得到整个字符串。如果你只想匹配包含!
的字符串,可以加一个前瞻:
re.match(r'[^!]*(?=!)', input)
这里不需要MULTILINE标志,因为没有锚点(^
和$
),而且也不需要DOTALL,因为没有点号。
4
为什么这需要用到正则表达式呢?
index = str.find('!')
if index > -1:
str = str[index:] # or (index+1) to get rid of the '!', too