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)