如何在Python中使用正则表达式从字符串中提取一小部分字符?

时间:2017-06-04 06:44:22

标签: python regex python-3.x

这是我的代码:

wish I may, I wish I m

我得到了结果:

wish I m

如果我只希望得到结果的上半部{{1}},我该如何修改我的代码呢?

非常感谢!

3 个答案:

答案 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 mwish 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?将匹配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

阅读有关REGULAR EXPRESSIONS here

的更多信息