【问题标题】:Regex match multiple numbers after keywords正则表达式匹配关键字后的多个数字
【发布时间】:2017-06-26 18:58:16
【问题描述】:

我有一个关于在 Python 下编写 Regex 的问题。

字符串是:

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 rules 下,3.6, 6.7, 8.9 and 10.11 将在 def rules 下。

我尝试使用正则表达式: (?<=abc rules) \d{1,2}.\d{1,2} 捕获abc规则后的所有数字,但我只能获取第一个数字。

我怎样才能实现目标?

谢谢大家!

【问题讨论】:

  • 它不知道继续追随, s。您可以执行类似(?:\d{1,2}.\d{1,2}(?:, )?)+ 之类的操作,然后在, 上拆分以获取每个单独的参考。
  • (?<=abc rules) \d{1,2}\.\d{1,2}(?:(?:,| and) \d{1,2}\.\d{1,2})*
  • (?<=def rules) \d{1,2}\.\d{1,2}(?:(?:\,| and|, and) \d{1,2}\.\d{1,2})* 这也适用于 def 规则。谢谢 sln 和 chris85!
  • @YichengWang:对于 Python re 的这种复杂要求,我认为单行正则表达式解决方案不是一个好主意。看,你可以使用\b(?:abc|def)\s+rules\s+(\d*\.*?\d+(?:(?:,|\s*and)\s*\d*\.*?\d+)*)(已经是一个复杂的模式),一旦找到匹配,你可以用\s*(?:,|\band\b)\s*拆分,见this Python demo。嗯,print([re.split(r'\s*(?:,|\band\b)\s*', x) for x in re.findall(rx, s)]) 也是一种单线:)
  • @WiktorStribiżew 谢谢老兄!你是对的,一行正则表达式不是解决问题的最佳方法。

标签: python regex python-3.x


【解决方案1】:

你可以使用

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']]

Python demo

关键是,您可以将子字符串与数字匹配,仅捕获数字部分,然后使用 \s*(?:,|\band\b)\s* 正则表达式拆分后面的部分。

这匹配所有子字符串:

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

regex demo

详情

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-04
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多