我正在尝试在大量文本中查找包含 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']
^\s*(?:\S+\s+){0,3}\S*:\s*$
这里,问题是
\s
还匹配换行符,而不仅仅是水平空白。你可以使用这个:
^[ \t]*(?:\S+[ \t]+){0,3}\S*:[ \t]*$
其中
[ \t]
将匹配空格或制表符。
您的问题是
\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:']