Python 使用正则表达式从给定单词开始直到字符串结束(包括换行符)提取字符串的一部分

Python 使用正则表达式从给定单词开始直到字符串结束(包括换行符)提取字符串的一部分,python,regex,string,Python,Regex,String,我知道正则表达式中的可以是除换行符以外的任何字符,[xy]表示x或y,*字符后的*表示该字符的任何数字,$表示字符串的结尾。那么为什么“伙计们[.\n]*$”不给我“伙计们”.\n你们在干什么?\n我希望你们今晚做个美梦。?你们把句点放在一个字符类中,在这个类中,句点只会匹配一个字符,而不会匹配其他字符[…]表示该类中包含的任何文字字符 您想改用以下选项: 或者,您应该将保留在字符类之外,并将其与\n换行符一起在组中使用: regex = re.compile("guys.*$", re.DOT

我知道正则表达式中的
可以是除换行符以外的任何字符,
[xy]
表示x或y,
*
字符后的
*
表示该字符的任何数字,
$
表示字符串的结尾。那么为什么
“伙计们[.\n]*$”
不给我
“伙计们”.\n你们在干什么?\n我希望你们今晚做个美梦。

你们把句点放在一个字符类中,在这个类中,句点只会匹配一个
字符,而不会匹配其他字符<代码>[…]表示该类中包含的任何文字字符

您想改用以下选项:

或者,您应该将
保留在字符类之外,并将其与
\n
换行符一起在组中使用:

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


您将句点放在字符类中,在该类中,句点仅与
字符匹配,而不与其他字符匹配<代码>[…]表示该类中包含的任何文字字符

您想改用以下选项:

或者,您应该将
保留在字符类之外,并将其与
\n
换行符一起在组中使用:

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

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

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

>>> regex = re.compile("guys.*",re.DOTALL|re.MULTILINE)
>>> regex.findall(stri)
['guys.\nHow are you doing?\nI hope you have sweet dreams tonight.']
使用
re.MULLTILINE
,您应该匹配多行

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

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

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

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

由于
\s
表示“所有空白”,而
\s
表示“除空白以外的任何内容”,因此将它们放在一个字符类中可以匹配任何字符,包括换行符。

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

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

由于
\s
表示“所有空白”,而
\s
表示“除空白以外的任何内容”,因此将它们放在一个字符类中可以匹配包括换行符在内的任何字符。

顺便说一句,如果使用标志
re.DOTALL
,则点也将匹配换行符(并且可以完全避免使用字符类)。顺便说一下,如果您使用标志
re.DOTALL
,则点也将匹配换行符(并且您可以完全避免使用字符类)。
re.MULTILINE
仅适用于
^
$
起始和结束锚定附着到的位置。是的,好的。。。我已经错误地使用了一段时间(谢谢:)总是喜欢学习新的
re。多行
只适用于
^
$
开始和结束锚连接的位置。是的,好的。。。我用错了一段时间(谢谢:)总是喜欢学习新东西
regex = re.compile(r"guys[\s\S]*$")