正则表达式:匹配特定单词后面的所有内容

18
我正在使用Python,想要匹配所有在test之后直到遇到句点(full-stop)或空格的单词。
我正在使用Python,想要匹配所有在test之后直到遇到句点(full-stop)或空格的单词。
text = "test : match this."

目前,我正在使用:

import re
re.match('(?<=test :).*',text)

上述代码没有匹配任何内容。我需要match this作为我的输出。


1
您的表达式是否无法正常工作?如果是这样,请提供它所产生的输出。 - SuperBiasedMan
1
并请指定您期望的输出:“match”,“match this”或“match this”。请告诉我们它为什么不起作用。 不起作用的具体原因是什么? - Wiktor Stribiżew
嗯,我正在使用的不起作用 :-) - Amith
1
你想匹配特定的单词子集吗?因为如果你只想提取test之后的所有单词,你可以使用子集。 - NDevox
你需要使用 re.search。通常情况下,match 会尝试从开头进行匹配。 - Avinash Raj
4个回答

49

2
这应该是被接受的答案,快速简单。 - Ekmek

19

你需要使用 re.search,因为 re.match 尝试从字符串开头匹配。要匹配到遇到空格或句号为止。

re.search(r'(?<=test :)[^.\s]*',text)

为匹配直到遇到句号的所有字符,

re.search(r'(?<=test :)[^.]*',text)

6
在一般情况下,正如标题所述,您可以使用(.*)模式捕获任何0个或多个除换行符之外的字符,在您想要的任何模式之后。请注意,capture是指捕获或提取。
import re
p = re.compile(r'test\s*:\s*(.*)')
s = "test : match this."
m = p.search(s)           # Run a regex search anywhere inside a string
if m:                     # If there is a match
    print(m.group(1))     # Print Group 1 value

如果您想让.匹配多行文本,可以使用re.DOTALLre.S标志编译正则表达式(或在模式前添加(?s))。
p = re.compile(r'test\s*:\s*(.*)', re.DOTALL)
p = re.compile(r'(?s)test\s*:\s*(.*)')

然而,它将返回match this.。还可以查看正则表达式演示
您可以在(.*)后添加\.模式,以使正则表达式引擎在该行的最后一个.之前停止:
test\s*:\s*(.*)\.

小心使用re.match(),因为它只会在字符串开头寻找匹配(Avinash已经指出了这一点,但这是一个非常重要的注意事项!)

请查看正则表达式演示和一个Python代码片段示例

import re
p = re.compile(r'test\s*:\s*(.*)\.')
s = "test : match this."
m = p.search(s)           # Run a regex search anywhere inside a string
if m:                     # If there is a match
    print(m.group(1))     # Print Group 1 value

如果你想确保test被作为一个完整的单词进行匹配,在它之前添加\b(不要从字符串字面量中删除r前缀,否则'\b'将匹配一个退格符!)- r'\btest\s*:\s*(.*)\.'

5

如果你只是从字符串中获取一个子集,我不明白为什么要使用正则表达式。

以下代码也可以达到同样的效果:

if line.startswith('test:'):
    print(line[5:line.find('.')])

例子:

>>> line = "test: match this."
>>> print(line[5:line.find('.')])
 match this

正则表达式运行缓慢,设计不便,调试困难。虽然肯定有使用正则表达式的场合,但如果您只想提取test:.之间的文本,则我认为这不是其中之一。
参见:https://softwareengineering.stackexchange.com/questions/113237/when-you-should-not-use-regular-expressions 如需更多灵活性(例如,如果您正在循环遍历要查找的字符串列表,并希望在字符串开头找到它们并索引出来),请用len(str_you_looked_for)替换索引中的5('test:'的长度)。

我完全同意。通常我尽量避免使用正则表达式。但是我需要在大量网页中匹配许多其他字符串。 - Amith
它们不同吗?它们不能以类似的方式被看到吗? - NDevox
刚刚看了你提供的链接,非常有趣。你让我重新考虑了我的方法!! - Amith
1
@Amith 我同意,没有任何附加条件 :) 我自己喜欢提供两种解决方案,基于正则表达式和非基于正则表达式的。这次不需要。 - Wiktor Stribiżew
@Amith,没问题。正则表达式是那种很容易被滥用的东西之一。 - NDevox
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接