重复python正则表达式,直到某个char

时间:2012-01-24 22:57:36

标签: python regex

我希望获得所有文字直到!出现。示例

some textwfwfdsfosjtortjk\n
sdsfsdfsdfsdfsdfsdfsdfsfsfsdfsdfsdf\n
sfsgdfgdfgdgdfgdg\n
!

之前的行数!更改,所以我不能像这样硬编码reg exp

"+\n^.+\n^.+"

我正在使用re.MULTLINE,但我应该使用re.DOTALL吗?

谢谢

7 个答案:

答案 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