python - 正则表达式从字符串中查找解析瓶大小(例如 750ML)
问题描述
我的数据库中有一长串不同产品的字符串,每个字符串都有产品标签和产品尺寸(包括包装尺寸)。我想将字符串分成两个子字符串:第一部分直到大小,第二部分包含液体的大小,可能还有包装的大小。例如,我有以下字符串:
str1 = 'PRODUCTA 1909 SUPERIOR GIN 89 PROOF 750ML'
str2 = 'PRODUCTB FLAV GIN 70 PROOF VAP 1.5L 2PK'
str3 = 'PRODUCTB FLAV GIN 70 PROOF VAP 1.5L 6PK'
str4 = 'PRODUCTC FLAV GIN 70 PROOF VAP 50ML 5PK'
我想得到的是:
str1a = 'PRODUCTA 1909 SUPERIOR GIN 89 PROOF'
str1b = '750ML'
str2a = 'PRODUCTB FLAV GIN 70 PROOF VAP'
str2b = '1.5L 2PK'
str2a = 'PRODUCTB FLAV GIN 70 PROOF VAP'
str2b = '1.5L 6PK'
str4a = 'PRODUCTC FLAV GIN 70 PROOF VAP'
str4b = '50ML 5PK'
这里的难点是很多产品的产品标签上都有数字(比如string1中的1909),而且有些产品的尺寸不仅是升的数量(1.5L、750ML等),还有它自带的包装尺寸在(2pack、6pack 等)中。
我想拆分字母 'L' 之前的每个数字,并忽略点。然后,ML 或 CL 或 L 将被同等对待,1.5L 仍应被捕获为 1.5L 而不是 15L。
有人可以帮助我使用正确的正则表达式吗?
解决方案
这是一个正则表达式模式和一个如何完成任务的示例:
PS:感谢@Toto 对管道的评论
import re
def get_volume(text):
# You can add all the list of volume fractions
_volume = re.search(r'(\d+(\.\d+)?[MCDNPF]?L(\s+\d+PK)?)', text)
if _volume:
volume = _volume.groups()[0]
return text.replace(volume, '').strip(), volume
return text, None
str1 = 'PRODUCTA 1909 SUPERIOR GIN 89 PROOF 750ML'
str2 = 'PRODUCTB FLAV GIN 70 PROOF VAP 1.5L 2PK'
str3 = 'PRODUCTB FLAV GIN 70 PROOF VAP 1.5L 6PK'
str4 = 'PRODUCTC FLAV GIN 70 PROOF VAP 50ML 5PK'
texts = [str1, str2, str3, str4]
for elm in texts:
print(get_volume(elm))
输出:
('PRODUCTA 1909 SUPERIOR GIN 89 PROOF ', '750ML')
('RODUCTB FLAV GIN 70 PROOF VA', '1.5L 2PK')
('RODUCTB FLAV GIN 70 PROOF VA', '1.5L 6PK')
('RODUCTC FLAV GIN 70 PROOF VA', '50ML 5PK')
更新:
如果您需要处理.5ML
使用此模式的情况:
r'((\d+(\.\d+)?|(\.\d+))[MCDNPF]?L(\s+\d+PK)?)'
因此,例如:
str1 = 'PRODUCTA 1909 SUPERIOR GIN 89 PROOF 750ML'
str2 = 'PRODUCTB FLAV GIN 70 PROOF VAP .5L 2PK'
str3 = 'PRODUCTB FLAV GIN 70 PROOF VAP 1.5L 6PK'
它将返回:
('PRODUCTA 1909 SUPERIOR GIN 89 PROOF ', '750ML')
('RODUCTB FLAV GIN 70 PROOF VA', '.5L 2PK')
('RODUCTB FLAV GIN 70 PROOF VA', '1.5L 6PK')
推荐阅读
- javascript - tslint CLI 和 jest CLI 在 iterm zsh macOS 上不起作用
- reactjs - this.props.x 不是函数,尽管 x 已绑定。反应.js
- php - php中的fibanocci系列
- c# - WMI 查询不更新
- c# - 数据库如何为 Windows 开发工作?
- php - 如何用一些值增加变量并重新排序结果
- php - Same Technic 无法更新和删除 while 循环记录
- firebase - VueJS + Firebase Auth + Route Guards - 同步问题/竞争条件
- python - 无法获取属性“Word2VecKeyedVectors”
- .net - 将“obj”向下转换为没有类型注释的底层数组类型