我有以下例子:
Tortillas Bolsa 2a 1kg 4118
Tortillinas 50p 1 31Kg TAB TR 46113
Bollos BK 4in 36p 1635g SL 131
Super Pan Bco Ajonjoli 680g SP WON 100
Pan Blanco Bimbo Rendidor 567g BIM 49973
Gansito ME 5p 250g MTA MLA 49860
我想保留数字之前的所有内容,但我也不想要两个大写字母单词示例:ME, BK
。我正在使用 ^((\D*).*?) [^A-Z]{2,3}
预期的结果应该是
Tortillas Bolsa
Tortillinas
Bollos
Super Pan Bco Ajonjoli
Pan Blanco Bimbo Rendidor
Gansito
使用正则表达式,我仍然得到两个大写字母单词 Bollos BK
和 Gansito ME
最佳答案
预编译具有前瞻性的正则表达式模式(如下所述)并在列表推导中使用 regex.match
:
>>> import re
>>> p = re.compile(r'\D+?(?=\s*([A-Z]{2})?\s*\d)')
>>> [p.match(x).group() for x in data]
[
'Tortillas Bolsa',
'Tortillinas',
'Bollos',
'Super Pan Bco Ajonjoli',
'Pan Blanco Bimbo Rendidor',
'Gansito'
]
这里,data
是您的字符串列表。
详细信息
\D+? # anything that isn't a digit (non-greedy)
(?= # regex-lookahead
\s* # zero or more wsp chars
([A-Z]{2})? # two optional uppercase letters
\s*
\d # digit
)
如果任何字符串不包含您要查找的模式,列表理解将出错(带有 AttributeError),因为 re.match
返回 None
在那种情况下。然后,您可以使用循环并在提取匹配部分之前测试 re.match
的值。
matches = []
for x in data:
m = p.match(x)
if m:
matches.append(m.group())
或者,如果在没有匹配项时需要占位符 None
:
matches = []
for x in data:
matches.append(m.group() if m else None)
关于python - 正则表达式两组匹配所有内容直到模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50223742/