1
import re

stri = "Hello guys.\nHow are you doing?\nI hope you have sweet dreams tonight."
regex = re.compile("guys[.\n]*$")

print regex.findall(stri)

我知道.在正则表达式中可以是除换行符之外的任何字符,[xy]表示 x 或 y,*在字符表示该字符的任意数量并$表示字符串的结尾之后。那为什么不"guys[.\n]*$"给我"guys.\nHow are you doing?\nI hope you have sweet dreams tonight."

4

3 回答 3

4

你把句点放在一个字符类中,它是一个只匹配一个.字符的地方,没有别的。表示该类中包含的[...]任何文字字符。

您想改用re.DOTALL配置常量

regex = re.compile("guys.*$", re.DOTALL)

或者,您应该保留.字符类的外部并在带有\n换行符的组中使用它:

regex = re.compile("guys(?:.|\n)*$")

演示:

>>> import re
>>> stri = "Hello guys.\nHow are you doing?\nI hope you have sweet dreams tonight."
>>> regex = re.compile("guys.*$", re.DOTALL)
>>> print regex.findall(stri)
['guys.\nHow are you doing?\nI hope you have sweet dreams tonight.']
于 2012-09-17T20:18:07.910 回答
2

Martijn 的回答很好地解释了您所看到的行为。作为re.DOTALLor(?:.\n)选项的替代方案,您可以使用类似以下的内容:

regex = re.compile(r"guys[\s\S]*$")

由于\s意味着“所有空格”并且\S意味着“除了空格之外的任何内容”,将它们放在一个字符类中将允许匹配任何字符,包括换行符。

于 2012-09-17T20:26:27.617 回答
0

使用re.MULLTILINE ,你应该匹配多行......

>>> regex = re.compile("guys.*",re.DOTALL|re.MULTILINE)
>>> regex.findall(stri)
['guys.\nHow are you doing?\nI hope you have sweet dreams tonight.']

/编辑:正如 martjin 指出的那样,我对多行的看法是错误的

>>> regex = re.compile("guys.*",re.DOTALL)
>>> regex.findall(stri)
['guys.\nHow are you doing?\nI hope you have sweet dreams tonight.']
于 2012-09-17T20:21:13.330 回答