正则表达式捕获新行的意外行为(python)

问题描述 投票:0回答:2

我正在尝试在大量文本中查找包含 4 个单词或更少且以“:”结尾的行。文本混乱,因此任何空格都可能出现在行的开头或结尾(我不希望这影响我的代码)。 这就是我正在尝试做的事情:

import re
my_string="""Requirements:
Knowledge Required:"""
pattern = r'^\s*(?:\S+\s+){0,3}\S*:\s*$'
print(re.findall(pattern, my_string, flags=re.MULTILINE))

预期输出为:

['Requirements:', 'Knowledge Required']

相反,我得到:

['Requirements:\nKnowledge Required']
regex nlp python-re
2个回答
1
投票
^\s*(?:\S+\s+){0,3}\S*:\s*$

这里,问题是

\s
还匹配换行符,而不仅仅是水平空白。你可以使用这个:

^[ \t]*(?:\S+[ \t]+){0,3}\S*:[ \t]*$

其中

[ \t]
将匹配空格或制表符。


0
投票

您的问题是

\S
将匹配
:
,而
\s
将匹配换行符。所以
(?:\S+\s+){0,3}\S*:
将匹配
Requirements:\nKnowledge Required
。请参阅 regex101 上的演示。您需要从单词中排除
:
并从空白中排除换行符(您可能可以简单地使用
 
(空格)),即

^\s*(?:[^:\s]+ +){0,3}[^: ]*: *$

在Python中:

my_string="""Requirements:
Knowledge Required:"""
pattern = r'^\s*(?:[^:\s]+ +){0,3}[^: ]*: *$'
print(re.findall(pattern, my_string, flags=re.MULTILINE))

输出:

['Requirements:', 'Knowledge Required:']
© www.soinside.com 2019 - 2024. All rights reserved.