Python在正则表达式定义的索引处截断字符串
我有一个字符串列表,例如Python在正则表达式定义的索引处截断字符串,python,regex,Python,Regex,我有一个字符串列表,例如 2007 ford falcon xr8 ripcurl bf mkii utility 5.4l v8 cyl 6 sp manual bionic 2004 nissan x-trail ti 4x4 t30 4d wagon 2.5l 4 cyl 5 sp manual twilight 2002 subaru liberty rx my03 4d sedan 2.5l 4 cyl 5 sp manual silver 我想在发动机容量(5.4l,2.5l
2007 ford falcon xr8 ripcurl bf mkii utility 5.4l v8 cyl 6 sp manual bionic
2004 nissan x-trail ti 4x4 t30 4d wagon 2.5l 4 cyl 5 sp manual twilight
2002 subaru liberty rx my03 4d sedan 2.5l 4 cyl 5 sp manual silver
我想在发动机容量(5.4l,2.5l)或车身类型(4d货车,4d轿车)时截断字符串,以先到者为准。因此,输出应为:
2007 ford falcon xr8 ripcurl bf mkii utility
2004 nissan x-trail ti 4x4 t30
2002 subaru liberty rx my03
我想我会用.split(“”)创建一个单词列表。然而,我的问题是如何在x.xl或xd字处停止,其中x可以是任何数字。什么样的正则表达式会处理这个问题?一种选择是用一个空字符串,使用
re.sub()
:
其中:
将匹配多个以\b[0-9.]+l\b
l
将匹配一个或多个数字,后跟字母\d+d(?:货车|轿车)
,后跟空格和d
或货车
<代码>(?:…)表示非捕获组轿车
作为后续问题,如果\d+d是一个后跟字母d的单个数字,我将如何限制它只匹配?我尝试了\d{0,1}+d,但这给出了一个error@Testy8当然,不要使用量词:
\d{1}d
。谢谢
>>> import re
>>>
>>> l = ["2007 ford falcon xr8 ripcurl bf mkii utility 5.4l v8 cyl 6 sp manual bionic ", "2004 nissan x-trail ti 4x4 t30 4d wagon 2.5l 4 cyl 5 sp manual twilight ", "2002 subaru liberty rx my03 4d sedan 2.5l 4 cyl 5 sp manual silver"]
>>> for item in l:
... print(re.sub(r"(\b[0-9.]+l\b|\d+d (?:wagon|sedan)).*$", "", item))
...
2007 ford falcon xr8 ripcurl bf mkii utility
2004 nissan x-trail ti 4x4 t30
2002 subaru liberty rx my03
^.*?(?=\s*\d+d\s+(?:wagon|sedan)|\s*\d+(?:\.\d+)?l)
import re
p = re.compile(ur'^.*?(?=\s*\d+d\s+(?:wagon|sedan)|\s*\d+(?:\.\d+)?l)', re.MULTILINE)
test_str = u"2007 ford falcon xr8 ripcurl bf mkii utility 5.4l v8 cyl 6 sp manual bionic \n2004 nissan x-trail ti 4x4 t30 4d wagon 2.5l 4 cyl 5 sp manual twilight \n2002 subaru liberty rx my03 4d sedan 2.5l 4 cyl 5 sp manual silver "
re.findall(p, test_str)