regex-在Python中第二次出现连字符后删除不需要的子字符串



下面是我需要从中提取有意义的ID的字符串

'12345-1-abcde-aBCD'
'123-Abcdefghi abcdefghijkl'
'1234567-1-AB-ABC A/1 ABC (AB1234)'
'12345-ABC-Abcdefghijkl'
'123456-Abcdefgh'
'12345-AB1CDE'

Regex应符合上述所有标准,并通过所有情况,以给出以下输出

12345-1
123
1234567-1
12345
123456
12345

如果有字母,Regex应该省略-连字符中的部分。

您可以这样做:

import re
l = ['12345-1-abcde-aBCD',
'123-Abcdefghi abcdefghijkl', 
'1234567-1-AB-ABC A/1 ABC (AB1234)',  
'12345-ABC-Abcdefghijkl',
'123456-Abcdefgh',
'12345-AB1CDE',]
In [10]: for s in l:
...:     print(re.match(r'^(d+[-]?d+?)',s))
...:                 
<re.Match object; span=(0, 7), match='12345-1'>
<re.Match object; span=(0, 3), match='123'>
<re.Match object; span=(0, 9), match='1234567-1'>
<re.Match object; span=(0, 5), match='12345'>
<re.Match object; span=(0, 6), match='123456'>
<re.Match object; span=(0, 5), match='12345'>

如果你可以有多个连字符和后面的数字,你可以做一些类似的事情:

l = ['12345-1-abcde-aBCD',
'123-Abcdefghi abcdefghijkl',
'1234567-1-AB-ABC A/1 ABC (AB1234)',
'12345-ABC-Abcdefghijkl',
'123456-Abcdefgh',
'12345-AB1CDE',
'12345-1-1-ABC',
'1-2-3-4-5-A-B-C-D-E-F-/-(AB12345)0',
'12345-1A Abcd',]
In [31]: for s in l: 
...:     match = re.match(r'^([d|-]*)(?![A-Za-z])',s)  
...:     print(match.group(0).rstrip('-')) 
...:                                                                                            
12345-1
123
1234567-1
12345
123456
12345
12345-1-1
1-2-3-4-5
12345

最新更新