Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中使用正则表达式匹配此模式_Python_Regex_Re - Fatal编程技术网

如何在Python中使用正则表达式匹配此模式

如何在Python中使用正则表达式匹配此模式,python,regex,re,Python,Regex,Re,我有一份带有不同符号的姓名列表: 例如: 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' 这些不同符号的标准化版本为,例如: myList = [ab2000, abc2000_2000, AB2

我有一份带有不同符号的姓名列表: 例如:

 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'
这些不同符号的标准化版本为,例如:

 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")
输出:

characters = ['AB', '2000', '2000', 'A', '1']
然后应用:

characters = list(set(characters))
最后尝试将该列表的值与字符串的主要组成部分相匹配:字母格式,数字格式,字母数字格式

但正如您在前面的输出中所看到的,我无法使用\W+将“A1”匹配为单个字符。我期望的输出是:

characters = ['AB', '2000', '2000', 'A1']
有没有办法解决这个问题


o总的来说,有没有更好的办法来解决我的问题。提前谢谢。

可选组和捕获组使用以下模式:

r'([A-Z]+)(\d+)(?:_([A-Z\d]+))?(?:_([A-Z\d]+))?'
re.I
标志

请注意,必须重复
(?:)([A-Z\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   

我不清楚在所有情况下,可能的输入是什么,或者期望的输出是什么。也许
^([A-Za-z]+)(\d+)([A-Za-z]*)(\d+)$
将匹配您想要的组?使用组匹配似乎比您尝试的标记化更简单。