我有一个字符串列表,例如
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.4升,2.5升)或车身类型(4d旅行车,4天轿车)上截断字符串,以先到者为准。所以输出应该是:
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可以是任何数字。什么样的正则表达式会选择这个?
答案 0 :(得分:2)
一种选择是替换所有内容,从带有数字后跟l
或数字后跟d
后跟wagon
或sedan
的单词开始,使用re.sub()
的空字符串:
>>> 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
其中:
\b[0-9.]+l\b
会匹配字,其中还有一个以l
结尾的数字或点\d+d (?:wagon|sedan)
会匹配一个或多个数字,后跟一个字母d
,后跟一个空格和wagon
或sedan
; (?:...)
表示非捕获组答案 1 :(得分:1)
^.*?(?=\s*\d+d\s+(?:wagon|sedan)|\s*\d+(?:\.\d+)?l)
你可以使用它。参见演示。
https://regex101.com/r/aC0uK6/1
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)