【发布时间】: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