簡體   English   中英

Python RE,可選匹配組的問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM