刚开始学习正则表达式。我这里有问题。
到目前为止,这是我的代码。
match = re.findall(r'\d{1,3}', string)
我知道我会得到每个第三个号码。但我不知道如何只告诉每个差距。
我有一个看起来像这样的字符串:
string = "24812949 2472198 4271748 12472187"
我想要一个这样的结果:
["248", "247", "427", "124"]
答案 0 :(得分:2)
使用字边界\b
。 \b
匹配单词字符和非单词字符。
match = re.findall(r'\b\d{1,3}', string)
OR
负面的背后断言。 (?<!\S)
断言匹配不会以非空格字符开头。
match = re.findall(r'(?<!\S)\d{1,3}', string)
答案 1 :(得分:1)
您可以将\b
添加为字边界:
>>> re.findall(r'\b\d{1,3}', string)
['248', '247', '427', '124']
但如果您的字符串始终采用此形式,则可以不使用正则表达式:
>>> [i[:3] for i in string.split()]
['248', '247', '427', '124']
答案 2 :(得分:1)
我很惊讶没有人考虑消耗其余数字而不是担心边界:
>>> re.findall(r'(\d{1,3})\d*', string)
['248', '247', '427', '124']
通过捕获前3位数字(或者在数字较小的情况下更少)并匹配其余数字,下一场比赛无法在数字中间发生。当前一个匹配结束时,它之后的下一个字符(如果有)必须是非数字的,并且由于引擎从左向右扫描,下一个匹配将从一串数字的开头开始。
当正则表达式中至少有一个捕获组时, re.findall
函数也只返回捕获组中的内容,从而平滑整个过程。
答案 3 :(得分:0)
(?:^|(?<=\s))\d{1,3}
试试这个。看看演示。
https://regex101.com/r/gQ3kS4/22
match = re.findall(r'(?:^|(?<=\s))\d{1,3}', string)
答案 4 :(得分:0)
尝试以下解决方案: -
string="24812949 2472198 4271748 12472187"
match = re.findall(r'\b\d{1,3}', string)
print match
输出: - ['248','247','427','124']