【问题标题】:python regex match optional square bracketspython 正则表达式匹配可选方括号
【发布时间】:2014-08-26 16:03:02
【问题描述】:

我有以下字符串:

1 "R J BRUCE & OTHERS V B J & W L A EDWARDS And Ors CA CA19/02 27 February 2003",     
2 "H v DIRECTOR OF PROCEEDINGS [2014] NZHC 1031 [16 May 2014]",  
3 '''GREGORY LANCASTER AND JOHN HENRY HUNTER V CULLEN INVESTMENTS LIMITED AND  
ERIC JOHN WATSON CA CA51/03 26 May 2003''' 

我正在尝试找到一个匹配所有这些的正则表达式。我不知道如何匹配字符串末尾日期周围的可选方括号,例如 [16 May 2014]。

casename = re.compile(r'(^[A-Z][A-Za-z\'\(\) ]+\b[v|V]\b[A-Za-z\'\(\) ]+(.*?)[ \[ ]\d+    \w+ \d\d\d\d[\] ])', re.S) 

最后的日期正则表达式只匹配带有方括号日期的情况,而不匹配没有日期的情况。

感谢所有回答的人。 @Matt Clarkson 我试图匹配的是更大文本中的司法判决“处理”。这些句柄之间存在很大差异,但它们都从一行的开头开始,在派对名称和末尾的日期之间有“v”代表。当事人的名字大多是大写的,但不是唯一的。我试图每个文档只有一个匹配项,并且没有误报。

【问题讨论】:

  • 了解您要在字符串中匹配的什么会很有帮助。
  • 第 3 行和第 4 行是否在同一行,或者它们在 'AND' 和 'ERIC' 之间是否包含物理换行符?
  • @OnlineCop 我想说的是,它用三引号括起来,它有一个物理换行符。

标签: python regex optional brackets square-bracket


【解决方案1】:

我使用这个来匹配所有这些(您需要添加不区分大小写的标志):

(^[a-z][a-z\'&\(\) ]+\bv\b[a-z&\'\(\) ]+(?:.*?) \[?\d+ \w+ \d{4}\]?)

Regex Demo

说明:

  • (开始捕获组
    • [a-z\'&\(\) ]+匹配本组中的一个或多个字符
    • \b匹配一个单词边界
    • v 匹配字符 'v' 字面意思
    • \b匹配一个单词边界
    • [a-z&\'\(\) ]+匹配该组中的一个或多个字符
    • (?:开始非抓包
      • .*? 匹配任何东西
    • )结束非捕获组
    • \[?\d+ \w+ \d{4}\]? 匹配日期,可选用括号括起来
  • )结束捕获组

【讨论】:

  • 带问号的东西正是我要找的东西:“[?”。这解决了我的问题。您知道该功能是如何调用的或记录在哪里吗?
  • ? 在正则表达式中的意思是“前面字符(范围)的 0 或 1”,这几乎意味着它是可选的。它可以在那里,也可以不在那里,只要不超过一个。
【解决方案2】:

如何使方括号可选,可以这样实现:

[\[]** 使开头 [ 成为可选。

如果可以的话,我有一些建议:

  • 这个\d\d\d\d也可以这样表达\d{4}

  • [v|V] 在正则表达式中 [] 中的内容已经是一个或另一个 | 没有必要 [vV]

这是一个online demo

【讨论】:

    【解决方案3】:

    Using your regex 和输入字符串,看起来你只会匹配第二行(如果你去掉正则表达式开头的 '^'。我已经在正则表达式的每个部分添加了内联 cmets您提供的目的是为了更清楚。

    你能指出你试图从每一行中捕获什么吗?你想要整个字符串吗?只有在单个字母“v”之前的单词?您要单独捕获日期吗?

    根据您要捕获的部分,每个部分都可以分成各自的匹配组:regex101.com example。这比您的要宽松一些(在引号之间捕获整个部分,而不是仅在单独的 'v' 之前的单个单词),并拆分以提高可读性(每个“组”在自己的行中)。

    This example 还假定换行符是有意的,并支持换行符组件(警告:它可能会比您预期的要多,具体取决于末尾的日期是否匹配)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-18
      • 2013-06-18
      • 1970-01-01
      • 2018-04-06
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多