【问题标题】:Parsing special symbol '( )' using regex使用正则表达式解析特殊符号 '( )'
【发布时间】:2018-10-08 10:25:53
【问题描述】:

我正在尝试使用正则表达式解析文档中的文本。文档包含不同的结构,即第 1.2 节,第 (1) 节。下面的正则表达式能够解析带小数点的文本,但 () 失败。

处理以 () 开头的内容的任何建议。

例如:

import re
RAW_Data = '(4) The Governor-General may arrange\n with the Chief Minister of the Australian Capital Territory for the variation or revocation of an \n\narrangement in force under subsection (3). \nNorthern Territory \n (5) The Governor-General may make arrangements with the \nAdministrator of the Northern \nTerritory with respect to the'

f = re.findall(r'(^\d+\.[\d\.]*)(.*?)(?=^\d+\.[\d\.]*)', RAW_Data,re.DOTALL|re.M|re.S)
for z in f:
    z=(''.join(z).strip().replace('\n',''))
    print(z)

预期输出:

(4) 总督可与澳大利亚首都直辖区首席部长安排更改或撤销根据第

小节生效的安排

(3) 北领地

(5) 总督可就“北领地行政长官”作出安排

【问题讨论】:

标签: python regex python-3.x regex-greedy


【解决方案1】:

使用正则表达式,[sS]ection\s*\(?\d+(?:\.\d+)?\)?

(?\d+(?:\.\d+)?\)? 将匹配任何带或不带小数点或大括号的数字

Regex

【讨论】:

    【解决方案2】:

    你可以试试:

    (?<=(\(\d\)|\d\.\d))(.(?!\(\d\)|\d\.\d))*
    

    要了解它的工作原理,请考虑以下块:

    (\(\d\)|\d\.\d)
    

    它查找(X)X.Y 类型的字符串,其中X 和Y 是数字。我们称这样的字符串为“分隔符”。

    现在,上面的正则表达式查找前面有分隔符的第一个字符(正向查找)并匹配后面的字符,直到找到后面跟有分隔符的字符(负向查找)。

    Try it here!

    希望对您有所帮助!

    【讨论】:

    • (.(?!\(\d\)|\d\.\d))* 应该写成(?:(?!\(\d\)|\d\.\d).)*。但是,要使该模式适用于 OP,您需要将所有捕获组转换为非捕获组。
    • 谢谢!你的正则表达式比我的好。但是,我不明白。既然是. 就跟着否定的lookhaed?不应该放在前面吗?
    • 我建议学习this answer
    【解决方案3】:

    有一个新的正则表达式\(\d\)[^(]+

    1. \(\d\) 匹配任何字符串,如 (1) (2) (3) ...

    2. [^(]+ 匹配一个或多个字符并在找到时停止匹配(

      测试:on Regex101

    但我想知道您是否有像 (4) The Governor-General may arrange\n with the Chief Minister of the Austr ... (2) (3). \nNorthern Territory \n 这样的特殊示例。这是来自(4) to (2)的一句话。因为我的正则表达式无法匹配这种类型的句子。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-29
      • 2015-12-23
      • 1970-01-01
      相关资源
      最近更新 更多