2017-06-04 25 views

回答

0

在正则表达式,.意味着单个字符和.*意味着任何数量的字符(0或更多)的。

当您使用w.*m时,默认情况下,python将查找以w开头并以m结尾的最长子字符串。 这叫做贪婪匹配

要查找与w开头和结尾m一串更小的子串,你必须寻找非贪婪

为此,而不是使用w.*m,请使用w.*?m。 由于?运算符,python匹配正则表达式给出的第一个子字符串。

从技术上讲,?使得到的RE匹配前面的RE的0或1个重复。例如:ab?将匹配aab。 所以,这里,w.*?m将匹配w(包含)后以m(包含)结尾的最少字符数。

>>> s = '''I wish I may, I wish I might 
... Have a dish of fish tonight.''' 
>>> 
>>> import re 
>>> m = re.search('w.*m', s) #GREEDY SEARCH 
>>> print(m.group()) 
wish I may, I wish I m 
>>> m = re.search('w.*?m', s) #NON GREEDY SEARCH 
>>> print(m.group()) 
wish I m 

了解更多关于正则表达式here

2

使用.*?match non-greedily

>>> s = '''I wish I may, I wish I might 
... Have a dish of fish tonight.''' 
>>> 
>>> import re 
>>> m = re.search('w.*?m', s) 
>>> m.group() 
'wish I m' 
0

你想在这里完成什么?你的正则表达式意味着它会匹配任何下列

'w.*m' will match: 
'well my cat is married' -> 'well my cat is m' 
'willy wonka had a wonky moped' -> 'willy wonka had a wonky m' 

你几乎说它应该匹配与w开头和结尾m任何短语。如下面重点介绍

wish i m一语中出现两次“我wish I m唉,我wish I m飞行 今晚有鱼的菜。”

所以,如果这是你正在寻找的短语,你的结果应该是wish I m,wish I m。为此,你需要这种模式 - w[\w\s]*m。因此,您不是贪婪.*,而是将匹配的字符限制为单词\w和空格\s,这些都是will I m

同样,这取决于你在找什么。

In [1]: import re 
In [4]: x = 'I wish I may, I wish I might Have a dish of fish tonight' 
In [5]: re.findall(r'w[\w\s]*m', x) 
Out[5]: ['wish I m', 'wish I m'] 
相关问题