这是我的代码:
wish I may, I wish I m
我得到了结果:
wish I m
如果我只希望得到结果的上半部{{1}},我该如何修改我的代码呢?
非常感谢!
答案 0 :(得分: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'
答案 1 :(得分: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
ay,我wish I m
ight
今晚吃一盘鱼。"
因此,如果这是您要查找的词组,则结果应为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']
答案 2 :(得分:0)
在正则表达式中,.
表示单个字符,.*
表示任意数量的字符(0或更多)。
当您使用w.*m
时,默认情况下,python将查找以w
开头并以m
结尾的最长子字符串。
这称为 GREEDY MATCH 。
要在以w
开头并以m
开头的字符串中查找较小的子字符串,您必须搜索 NON GREEDILY 。
为此,请使用w.*m
,而不是w.*?m
。
由于?
运算符,python匹配正则表达式给出的第一个子字符串。
从技术上讲,?
使得到的RE匹配前面RE的0或1次重复。示例:ab?
将匹配a
或ab
。
因此,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
阅读有关REGULAR EXPRESSIONS here
的更多信息