简单的python正则表达式无法按预期工作

时间:2019-06-30 16:11:16

标签: python regex python-regex

我正在尝试提取-之前的数字以及它后面的字符串的其余部分,但是无法同时提取这两个数字。这是交互式终端的输出:

>>> a = '#232 - Hello There'
>>> re.findall('#(.*?) - (.*?)', a)
[('232', '')]

为什么我的正则表达式不能正常工作?

3 个答案:

答案 0 :(得分:8)

.*? non-greedy ,即它将匹配最小的子字符串,您需要 greedy 版本,即.*(匹配最长的子字符串)对于后一个:

In [1143]: a = '#232 - Hello There'                                                                                                                                                                         

In [1144]: re.findall('#(.*?) - (.*?)', a)                                                                                                                                                                  
Out[1144]: [('232', '')]

In [1145]: re.findall('#(.*?) - (.*)', a)                                                                                                                                                                   
Out[1145]: [('232', 'Hello There')]

但是您应该使用str方法来处理这种简单的情况,例如使用 str.split -进行分割:

In [1146]: a.split(' - ')                                                                                                                                                                      
Out[1146]: ['#232', 'Hello There']

str.partition上使用 - 并切片:

In [1147]: a.partition(' - ')[::2]                                                                                                                                                                          
Out[1147]: ('#232', 'Hello There')

答案 1 :(得分:0)

此表达式可能会提取那些所需的值:

([0-9]+)\s*-\s*(.*)

Demo

测试

import re

print(re.findall("([0-9]+)\s*-\s*(.*)", "#232 - Hello There"))

输出

[('232', 'Hello There')]

答案 2 :(得分:0)

您的正则表达式很好,您只是在使用re中的错误函数。以下内容正确匹配:

m = re.fullmatch('#(.*?) - (.*?)', a)