如何在 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'
我尝试的是使用编译来分隔字符串的不同字符。
输入:
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
我有一个带有不同符号的名字列表: 例如:
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'
我尝试的是使用编译来分隔字符串的不同字符。
输入:
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