簡體   English   中英

如何在 Python 中使用正則表達式匹配此模式

[英]How to match this pattern using regex in Python

我有一個帶有不同符號的名稱列表:例如:

 myList = [ab2000, abc2000_2000, AB2000, ab2000_1, ABC2000_01, AB2000_2, ABC2000_02, AB2000_A1]

這些不同符號的標准化版本是,例如:

'ab2000' is 'ABC2000'
'ab2000_1' is 'ABC2000_01'
'AB2000_A1' is 'ABC2000_A1'

我嘗試的是使用 compile 來分隔字符串的不同字符。

輸入:

compiled = re.compile(r'[A-Za-z]+|\d+|\W+')
compiled.findall("AB2000_2000_A1")

output:

characters = ['AB', '2000', '2000', 'A', '1']

然后申請:

characters = list(set(characters))

最后嘗試將該列表的值與字符串的主要組成部分進行匹配:一個字母格式,后跟一個數字格式,然后是一個字母數字格式。

但正如您在之前的 output 中看到的那樣,我無法使用 \W+ 將“A1”匹配為單個字符。 我想要的 output 是:

characters = ['AB', '2000', '2000', 'A1']

有什么辦法解決這個問題嗎?

o 任何更好的想法來解決我的一般問題。 先感謝您。

將以下模式與可選組捕獲組一起使用:

r'([A-Z]+)(\d+)(?:_([A-Z\d]+))?(?:_([A-Z\d]+))?'

re.I標記。

請注意(?:_([AZ\d]+))? 必須重復以匹配第三組和第四組。 如果您嘗試“重復”該組,將其與“*”一起放置一次,它將僅匹配最后一組,跳過第三組。

為了測試它,我運行了以下測試:

myList = ['ab2000', 'abc2000_2000', 'AB2000', 'ab2000_1', 'ABC2000_01',
    'AB2000_2', 'ABC2000_02', 'AB2000_A1', 'AB2000_2000_A1']
pat = re.compile(r'([A-Z]+)(\d+)(?:_([A-Z\d]+))?(?:_([A-Z\d]+))?', re.I)
for tt in myList:
    print(f'{tt:16} ', end=' ')
    mtch = pat.match(tt)
    if mtch:
        for it in mtch.groups():
            if it is not None:
                print(f'{it:5}', end=' ')
    print()

得到:

ab2000            ab    2000  
abc2000_2000      abc   2000  2000  
AB2000            AB    2000  
ab2000_1          ab    2000  1     
ABC2000_01        ABC   2000  01    
AB2000_2          AB    2000  2     
ABC2000_02        ABC   2000  02    
AB2000_A1         AB    2000  A1    
AB2000_2000_A1    AB    2000  2000  A1   

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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