我正在尝试提取-
之前的数字以及它后面的字符串的其余部分,但是无法同时提取这两个数字。这是交互式终端的输出:
>>> a = '#232 - Hello There'
>>> re.findall('#(.*?) - (.*?)', a)
[('232', '')]
为什么我的正则表达式不能正常工作?
答案 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*(.*)
import re
print(re.findall("([0-9]+)\s*-\s*(.*)", "#232 - Hello There"))
[('232', 'Hello There')]
答案 2 :(得分:0)
您的正则表达式很好,您只是在使用re
中的错误函数。以下内容正确匹配:
m = re.fullmatch('#(.*?) - (.*?)', a)