python 正则匹配可选方括号
我有以下这些字符串:
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 个回答
根据你提供的正则表达式和输入字符串,似乎你只会匹配到第二行(如果你去掉正则表达式开头的'^'符号)。我在你提供的正则表达式的每个部分上添加了注释,以便让它更清楚。
你能说明一下你想从每一行中提取什么吗?你想要整行字符串吗?还是只想要在单独的字母'v'前面的那个词?你想要单独提取日期吗?
根据你想提取的部分,每个部分可以拆分成各自的匹配组:regex101.com 示例。这个例子比你的稍微宽松一些(它会捕获引号之间的整个部分,而不仅仅是单独'v'前面的那个词),并且为了提高可读性,每个“组”都单独放在一行。
这个例子也假设换行符是故意的,并支持换行的部分(注意:这可能会捕获到比你想要的更多内容,具体取决于最后的日期是否被匹配到)。
如何让方括号变成可选的,可以这样实现:
[\[]*
这里的 *
让开头的 [
变成了可选的。
如果可以的话,我有几点建议:
\d\d\d\d
也可以这样写\d{4}
在正则表达式中,
[v|V]
里的内容已经是一个选项了,|
是不必要的,可以直接写成[vV]
这里有一个 在线演示
我用这个方法让所有的内容都匹配上了(你需要加上不区分大小写的标志):
(^[a-z][a-z\'&\(\) ]+\bv\b[a-z&\'\(\) ]+(?:.*?) \[?\d+ \w+ \d{4}\]?)
解释:
(
开始一个捕获组[a-z\'&\(\) ]+
匹配这个组里的一个或多个字符\b
匹配一个单词的边界v
字面意思匹配字符'v'
\b
再次匹配一个单词的边界[a-z&\'\(\) ]+
匹配这个组里的一个或多个字符(?:
开始一个不捕获的组.*?
匹配任意内容)
结束不捕获的组\[?\d+ \w+ \d{4}\]?
匹配一个日期,可能会被括号包围)
结束捕获组