python - 正则表达式两组匹配所有内容直到模式

标签 python regex string split

我有以下例子:

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 BKGansito 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/

相关文章:

python - 需要在原始页面而不是重定向页面上提供表单值响应

javascript - 从字符串中删除非字母数字字符

regex - 在 bash 中交换文件中的 2 个单词的最佳方法是什么

c++ - 了解此打印结果

python - 硬币所有组合 - 两种算法之间的奇怪差异

python - 如何使用keras实现LSTM中多元回归的输入?

ios - Swift 中 UITableView 的动态搜索功能

c# - 如何根据宽度值获取字符串部分?

python - 从列表创建二元组

python - 从停用词列表中重新替换多个字符串模式