Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 正则表达式在关键字后匹配多个数字_Python_Regex_Python 3.x - Fatal编程技术网

Python 正则表达式在关键字后匹配多个数字

Python 正则表达式在关键字后匹配多个数字,python,regex,python-3.x,Python,Regex,Python 3.x,我有一个关于在Python下编写正则表达式的问题 字符串为: abc rules 2.3, 4.5, 6.7, 8.9 and def rules 3.6, 6.7, 8.9 and 10.11. 我的目标是尝试使用一行正则表达式来捕获所有数字 此外,我想把数字分成不同的组2.3、4.5、6.7、8.9应在集团abc规则下,而3.6、6.7、8.9和10.11将在def规则下 我尝试使用正则表达式: (?您可以使用 import re rx = r"\b(?:abc|def)\s+rules\

我有一个关于在Python下编写正则表达式的问题

字符串为:

abc rules 2.3, 4.5, 6.7, 8.9 and def rules 3.6, 6.7, 8.9 and 10.11.
我的目标是尝试使用一行正则表达式来捕获所有数字

此外,我想把数字分成不同的组<代码>2.3、4.5、6.7、8.9应在集团
abc规则下,而
3.6、6.7、8.9和10.11将在
def规则下

我尝试使用正则表达式:
(?您可以使用

import re
rx = r"\b(?:abc|def)\s+rules\s+(\d*\.*?\d+(?:(?:,|\s*and)\s*\d*\.*?\d+)*)"
s = "abc rules 2.3, 4.5, 6.7, 8.9 and def rules 3.6, 6.7, 8.9 and 10.11."
print([re.split(r'\s*(?:,|\band\b)\s*', x) for x in re.findall(rx, s)])
# => [['2.3', '4.5', '6.7', '8.9'], ['3.6', '6.7', '8.9', '10.11']]

关键是,您可以将子字符串与数字匹配,捕获数字部分,然后使用
\s*(?:,|\band\b)\s*
regex拆分后一部分

这将匹配所有子字符串:

\b(?:abc|def)\s+rules\s+(\d*\.*?\d+(?:(?:,|\s*and)\s*\d*\.*?‌​\d+)*)

详细信息

  • \b
    -单词边界
  • (?:abc|def)
    -要么
    abc
    要么
    def
  • \s+
    -1个或多个空格
  • 规则
    -子字符串
    规则
  • \s+
    -1个或多个空格
  • (\d*\.\d+(?:(?:,|\s*和)\s*\d*\.*?‌​\d+*)
    -第1组捕获:
    • \d*\.\d+
      -一个整数或浮点数
    • (?:(?:,|\s*和)\s*\d*\.*?‌​\d+*
      -零个或多个序列:
      • (?:,|\s*和)
        -
        或0+空格,然后是
      • \s*
        -0+空格
      • \d*\.*?‌​\d+
        -整数或浮点数

\s*(?:,|\band\b)\s*
正则表达式匹配一个逗号或一个完整的单词
,并用0+空格括起来。

它不知道在
后继续进行。你可以做一些类似的事情,
(?:\d{1,2}.\d{1,2}(?,)+
然后可以在
上拆分以获得每个引用。
(?@YichengWang:我认为一行正则表达式解决方案对于Python
re
这样复杂的需求不是一个好主意。你可以使用(已经是一个复杂的模式),一旦找到匹配项,你可以使用
\s*(?:,|\band\b)\s*
,请参见。
打印([re.split(r'\s*(?:,|\band\b)\s*),x)在re.findall(rx,s)]
也是一种单行代码:)@WiktorStribiżew谢谢!你说得对,单行正则表达式不是解决问题的最佳方法。