首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python,可选匹配组的问题

Python,可选匹配组的问题
EN

Stack Overflow用户
提问于 2022-12-02 00:08:53
回答 1查看 27关注 0票数 0

如果以前有人问过这件事,我很抱歉。我正在解析加州刑法中的一些法律编号,这样它们就可以通过现有的数据库进行运行,从而返回一个普通的法律标题。例如:

PC 182(A)(1);PC 25400(A)(1);PC 25850(C)(6);PC 32310;VC 12500(A);VC 22517;VC 23103(A)

每一种都会在“;”处被分割,并被解析为:

{“法律类型”:“PC”,“lawNumber”:“182”,“分段”:“a”,“子分段”:“1”}返回:共谋犯罪

这是我的RE搜索:

代码语言:javascript
运行
复制
(?P<lawType>[A-Z]{2})[ ](?P<lawNumber>[0-9.]*[A-Z]?)\((?P<subsection>[A-Z])\)?\((?P<subsubsection>[0-9])\)?

每一项法律至少应有类型和数目(即PC 182),但有时它们也有分款和分款(即(A)(1))。这两个子组需要是可选的,但是上面的搜索并不是使用'?‘来获取它们。这段代码可以工作,但我想让它更紧凑,只需一次搜索:

代码语言:javascript
运行
复制
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))

我有三种不同的搜索,如果“?”可选的组标记按预期工作。有人能给我一个想法吗?

EN

回答 1

Stack Overflow用户

发布于 2022-12-02 00:22:49

问题在于如何应用?使每个子节都是可选的。?仅适用于紧接它之前的术语。在您的情况下,这只是每个小节的结束括号,因此,您需要为每个分段无条件地使用括号和数字或字母。要解决这个问题,只需将完整的分段术语封装在一组额外的括号中,并将?应用于这些组。此代码:

代码语言:javascript
运行
复制
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()

生产:

代码语言:javascript
运行
复制
[('PC', '182', 'A', '1'), ('PC', '25400', 'A', '1'), ('PC', '25850', 'C', '6'), ('PC', '32310', '', ''), ('VC', '12500', 'A', ''), ('VC', '22517', '', ''), ('VC', '23103', 'A', '')]

下面是一个示例,说明如何使用您的表达式来单独选择每个法律的信息,并使用您的组标签:

代码语言:javascript
运行
复制
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()

结果

代码语言:javascript
运行
复制
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

在应用regex之前,注意到您是如何预分割数据的,我想您可能想看看我如何使用regex匹配来处理每个术语。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74649500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档