我希望获得所有文字直到!出现。示例
some textwfwfdsfosjtortjk\n
sdsfsdfsdfsdfsdfsdfsdfsfsfsdfsdfsdf\n
sfsgdfgdfgdgdfgdg\n
!
之前的行数!更改,所以我不能像这样硬编码reg exp
"+\n^.+\n^.+"
我正在使用re.MULTLINE,但我应该使用re.DOTALL吗?
谢谢
答案 0 :(得分:4)
为什么这需要正则表达式?
index = str.find('!')
if index > -1:
str = str[index:] # or (index+1) to get rid of the '!', too
答案 1 :(得分:3)
所以你想匹配从输入开始到(但不包括)第一个!
字符的所有内容?这应该这样做:
re.match(r'[^!]*', input)
如果没有感叹号,这将匹配整个字符串。如果您只想匹配其中包含!
的字符串,请添加前瞻:
re.match(r'[^!]*(?=!)', input)
不需要MULTILINE标志,因为没有锚点(^
和$
),因为没有点,所以不需要DOTALL。
答案 2 :(得分: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
);如果失败({ {1}}方法引发index
)然后你请求宽恕(返回最初收到的字符串)。这种方法(EAFP)在应用时被认为是Pythonic,就像在这种情况下一样。
不需要正则表达式;这是一个简单的问题。
答案 3 :(得分:0)
查看您正在阅读的特定字符的“前瞻”,并将整个第一部分作为模式进行匹配。
我不确定Python的正则表达式读取器与Ruby有何不同,但您可以在rubular.com中使用它
可能是这样的:
([^!]*(?=\!))
(试过这个,好像有效)
答案 4 :(得分:0)
它应该完成这项工作。
re.compile('(.*?)!', re.DOTALL).match(yourString).group(1)
答案 5 :(得分:0)
我认为你让它变得比它需要的更复杂。你的reg exp只需说“重复(除了!之外的任何字符),然后!”。请记住[^!]
表示“除了!之外的任何字符”。
所以,就像这样:
>>> import re
>>> rexp = re.compile("([^!]*)!")
>>> test = """sdasd
... asdasdsa
... asdasdasd
... asdsadsa
... !"""
>>> rexp.findall(test)
['sdasd\nasdasdsa\nasdasdasd\nasdsadsa\n']
>>>
答案 6 :(得分:-1)
re.DOTALL
就足够了:
import re
text = """some textwfwfdsfosjtortjk
sdsfsdfsdfsdfsdfsdfsdfsfsfsdfsdfsdf
sfsgdfgdfgdgdfgdg
!"""
rExp = re.compile("(.*)\!", re.S)
print rExp.search(text).groups()[0]
some textwfwfdsfosjtortjk
sdsfsdfsdfsdfsdfsdfsdfsfsfsdfsdfsdf
sfsgdfgdfgdgdfgdg