我正在使用Python,并希望在test
之后匹配所有单词,直到遇到句点(句号)或空格。
text = "test : match this."
目前,我正在使用:
import re
re.match('(?<=test :).*',text)
以上代码与任何内容都不匹配。我需要match this
作为输出。
答案 0 :(得分:5)
您需要使用re.search,因为re.match
尝试从字符串的边缘进行匹配。匹配直到遇到空格或句号。
re.search(r'(?<=test :)[^.\s]*',text)
要匹配所有字符,直到遇到句号,
re.search(r'(?<=test :)[^.]*',text)
答案 1 :(得分:2)
在一般情况下,正如标题所提到的,您可以捕获以(.*)
模式在您想要的任何模式之后使用除换行之外的任何0个或更多个字符:
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.DOTALL
或re.S
标记(或在模式前添加(?s)
)编译正则表达式:
p = re.compile(r'test\s*:\s*(.*)', re.DOTALL)
p = re.compile(r'(?s)test\s*:\s*(.*)')
然而,it will retrun match this.
。另请参阅regex demo。
您可以在\.
之后添加(.*)
模式,以使正则表达式引擎在该行的最后.
之前停止:
test\s*:\s*(.*)\.
Watch out for re.match()
因为它只会在字符串的开头找一个匹配项(Avinash aleady指出了这一点,但这是一个非常重要的注释!)
请参阅regex demo和sample Python code snippet:
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
前缀,或{{1} }将匹配一个BACKSPACE字符!) - '\b'
。
答案 2 :(得分:2)
如果您只是从字符串中获取子集,我不明白为什么要使用正则表达式。
这的方式相同:
public static final String
示例:
if line.startswith('test:'):
print(line[5:line.find('.')])
正则表达式很慢,设计很难,而且很难调试。肯定有使用它的场合,但是如果你只是想在>>> line = "test: match this."
>>> print(line[5:line.find('.')])
match this
和test:
之间提取文字,那么我认为不是其中之一。
为了获得更大的灵活性(例如,如果循环遍历字符串列表,希望在字符串的开头找到然后索引),请用{{替换索引中的5('test:'的长度) 1}}。
答案 3 :(得分:2)