正则表达式:查找特定字符串后的所有数字

Posted

技术标签:

【中文标题】正则表达式:查找特定字符串后的所有数字【英文标题】:RegEx: Find all digits after certain string 【发布时间】:2016-02-10 08:43:29 【问题描述】:

我正在尝试从单词classes或其变体)之后的以下字符串中获取所有数字

Accepted for all the goods and services in classes 16 and 41.

预期输出:

16
41

我有多个遵循这种模式的字符串以及其他一些字符串,例如:

classes 5 et 30 # expected output 5, 30
class(es) 32,33 # expected output 32, 33
class 16        # expected output 5

这是我迄今为止尝试过的:https://regex101.com/r/eU7dF6/3

(class[\(es\)]*)([and|et|,|\s]*(\d1,))+

但在上面的例子中,我只能得到最后一个匹配的数字,即41

【问题讨论】:

【参考方案1】:

我建议在classclasses/class(es) 之后获取所有带有数字的子字符串,然后从中获取所有数字:

import re
p = re.compile(r'\bclass(?:\(?es\)?)?(?:\s*(?:and|et|[,\s])?\s*\d+)+')
test_str = "Accepted for all the goods and services in classes 16 and 41."
results = [re.findall(r"\d+", x) for x in p.findall(test_str)]
print([x for l in results for x in l])
# => ['16', '41']

见IDEONE demo

由于不支持\G 构造,您也无法使用Python re 模块访问捕获堆栈,因此您无法使用您的方法。

但是,您可以像 PyPi regex module 那样做。

>>> import regex
>>> test_str = "Accepted for all the goods and services in classes 16 and 41."
>>> rx = r'\bclass(?:\(?es\)?)?(?:\s*(?:and|et|[,\s])?\s*(?P<num>\d+))+'
>>> res = []
>>> for x in regex.finditer(rx, test_str):
        res.extend(x.captures("num"))
>>> print res
['16', '41']

【讨论】:

感谢 Wiktor,但是您所建议的也是一种双重方法,就像vks 提供的答案一样,我当然可以使用这种方法。但我想有一个可以给我结果的正则表达式。 但是你可以使用 PyPi 正则表达式模块吗?我说过你不能在re 中使用单个正则表达式。 使用外部库根本不是问题。 :) @AKS 如果不是问题,您可以检查我的编辑...不要在 python 中使用regex 模块 感谢 Wiktor,我使用了带有正确正则表达式的正则表达式模块,效果很好!【参考方案2】:

您可以分两步完成。Regex 引擎只记住连续组中的最后一组。

x="""Accepted for all the goods and services in classes 16 and 41."""
print re.findall(r"\d+",re.findall(r"class[\(es\)]*\s*(\d+(?:(?:and|et|,|\s)*\d+)*)",x)[0])

输出:['16', '41']

如果你不想string使用

print map(ast.literal_eval,re.findall(r"\d+",re.findall(r"class[\(es\)]*\s*(\d+(?:(?:and|et|,|\s)*\d+)*)",x)[0]))

输出:[16, 41]

如果您必须在一个正则表达式中执行此操作,请使用 regex 模块

import regex
x="""Accepted for all the goods and services in classes 16 and 41."""
print [ast.literal_eval(i) for i in regex.findall(r"class[\(es\)]*|\G(?:and|et|,|\s)*(\d+)",x,regex.VERSION1) if i]

输出:[16, 41]

【讨论】:

是的!事实上,我可以做到这一点。但我只是想知道是否有一个纯正则表达式可以满足我的需求。 @AKS 检查编辑..您可以使用regex 模块进行操作,但默认 python 中不存在 @vks: :) 那里是睡觉时间吗?见this demo,你就会明白了。

以上是关于正则表达式:查找特定字符串后的所有数字的主要内容,如果未能解决你的问题,请参考以下文章

C#正则表达式如何提取一段字符串中汉字后的数字

正则表达式:数字开头中间字母结尾数字

如何使用正则表达式查找具有特定起始字符串的所有匹配项? [复制]

正则表达式根据其中的值获取特定匹配括号后的所有内容

正则表达式查找 4 个条件中的 3 个

Java提取文本文档中的所有网址(小案例介绍正则基础知识)