[英]Python RE, problem with optional match groups
如果之前有人问过这个问题,我深表歉意。 我正在解析加利福尼亚州刑法中的一些法律编号,以便它们可以通过现有数据库运行以返回法律的明文标题。 例如:
PC 182(A)(1); PC 25400(A)(1); PC 25850(C)(6); 个人计算机 32310; VC 12500(A); VC 22517; VC 23103(A)
每个都会在';'处分开并解析为:
{'lawType': 'PC', 'lawNumber': '182', 'subsection': 'A', 'subsubsection': '1'} 返回:串谋犯罪
这是我的 RE 搜索:
(?P<lawType>[A-Z]{2})[ ](?P<lawNumber>[0-9.]*[A-Z]?)\((?P<subsection>[A-Z])\)?\((?P<subsubsection>[0-9])\)?
每部法律都应该至少有类型和编号(即 PC 182),但有时它们也有小节和小节(即(A)(1))。 这两个子组需要是可选的,但上面的搜索没有使用“?”来挑选它们。 这段代码有效,但我想通过一次搜索使其更紧凑:
lineValue = 'PC 182(A)(1); PC 25400(A)(1); PC 25850(C)(6); PC 32310; VC 12500(A); VC 22517; VC 23103(A)'
#lineValue = 'PC 148(A)(1); PC 369I; PC 587C; MC 8.80.060(F)'
chargeList = map(lambda x: x.strip(), lineValue.split(';'))
for thisCharge in chargeList:
m = re.match(r'(?P<lawType>[A-Z]{2})[ ](?P<lawNumber>[0-9.]*[A-Z]?)\((?P<subsection>[A-Z])\)\((?P<subsubsection>[0-9])\)', thisCharge)
if m:
detail = m.groupdict()
print(detail)
else:
m = re.match(r'(?P<lawType>[A-Z]{2})[ ](?P<lawNumber>[0-9.]*[A-Z]?)\((?P<subsection>[A-Z])\)', thisCharge)
if m:
detail = m.groupdict()
print(detail)
else:
m = re.match(r'(?P<lawType>[A-Z]{2})[ ](?P<lawNumber>[0-9.]*[A-Z]?)', thisCharge)
if m:
detail = m.groupdict()
print(detail)
else:
print('NO MATCH: ' + str(thisCharge))
我有三个不同的搜索,如果'? 可选组标记按预期工作。 谁能提供一个想法?
问题在于您如何应用?
使每个小节可选。 一个?
仅适用于它之前的术语。 在您的情况下,这只是每个小节的右括号因此,您需要无条件地为每个小节术语添加左括号和数字或字母。 要解决此问题,只需将完整的小节术语括在一组额外的括号中,然后应用?
给那些群体。 这段代码:
import re
data = "PC 182(A)(1); PC 25400(A)(1); PC 25850(C)(6); PC 32310; VC 12500(A); VC 22517; VC 23103(A)"
exp = re.compile(r"(?P<lawType>[A-Z]{2})[ ](?P<lawNumber>[0-9.]*[A-Z]?)(?:\((?P<subsection>[A-Z])\))?(?:\((?P<subsubsection>[0-9])\))?")
def main():
r = exp.findall(data)
print(r)
main()
产生:
[('PC', '182', 'A', '1'), ('PC', '25400', 'A', '1'), ('PC', '25850', 'C', '6'), ('PC', '32310', '', ''), ('VC', '12500', 'A', ''), ('VC', '22517', '', ''), ('VC', '23103', 'A', '')]
下面是一个示例,说明如何使用您的表达式分别挑选每条法律的信息,并使用您的组标签:
def main():
p = 0
while True:
m = exp.search(data[p:])
if not m:
break
print('Type:', m.group('lawType'))
print('Number:', m.group('lawNumber'))
if m.group('subsection'):
print('Subsection:', m.group('subsection'))
if m.group('subsubsection'):
print('Subsubsection:', m.group('subsubsection'))
print()
p += m.end()
结果
Type: PC
Number: 182
Subsection: A
Subsubsection: 1
Type: PC
Number: 25400
Subsection: A
Subsubsection: 1
Type: PC
Number: 25850
Subsection: C
Subsubsection: 6
Type: PC
Number: 32310
Type: VC
Number: 12500
Subsection: A
Type: VC
Number: 22517
Type: VC
Number: 23103
Subsection: A
注意到您在应用正则表达式之前如何预先拆分数据,我想您可能想看看我将如何仅使用正则表达式匹配来处理每个术语。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.