python 正则匹配可选方括号

9 投票
3 回答
27585 浏览
提问于 2025-04-18 18:36

我有以下这些字符串:

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 个回答

1

根据你提供的正则表达式和输入字符串,似乎你只会匹配到第二行(如果你去掉正则表达式开头的'^'符号)。我在你提供的正则表达式的每个部分上添加了注释,以便让它更清楚。

你能说明一下你想从每一行中提取什么吗?你想要整行字符串吗?还是只想要在单独的字母'v'前面的那个词?你想要单独提取日期吗?

根据你想提取的部分,每个部分可以拆分成各自的匹配组:regex101.com 示例。这个例子比你的稍微宽松一些(它会捕获引号之间的整个部分,而不仅仅是单独'v'前面的那个词),并且为了提高可读性,每个“组”都单独放在一行。

这个例子也假设换行符是故意的,并支持换行的部分(注意:这可能会捕获到比你想要的更多内容,具体取决于最后的日期是否被匹配到)。

3

如何让方括号变成可选的,可以这样实现:

[\[]* 这里的 * 让开头的 [ 变成了可选的。

如果可以的话,我有几点建议:

  • \d\d\d\d 也可以这样写 \d{4}

  • 在正则表达式中,[v|V] 里的内容已经是一个选项了,| 是不必要的,可以直接写成 [vV]

这里有一个 在线演示

4

我用这个方法让所有的内容都匹配上了(你需要加上不区分大小写的标志):

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

正则表达式演示

解释:

  • ( 开始一个捕获组
    • [a-z\'&\(\) ]+ 匹配这个组里的一个或多个字符
    • \b 匹配一个单词的边界
    • v 字面意思匹配字符 'v'
    • \b 再次匹配一个单词的边界
    • [a-z&\'\(\) ]+ 匹配这个组里的一个或多个字符
    • (?: 开始一个不捕获的组
      • .*? 匹配任意内容
    • ) 结束不捕获的组
    • \[?\d+ \w+ \d{4}\]? 匹配一个日期,可能会被括号包围
  • ) 结束捕获组

撰写回答