如何用正则表达式过滤文本行中的字符串模式?
我需要在给定的文本中用Python匹配这个正则表达式模式。
文本内容是:
"""
2010 Toyota FJ Cruiser FJ CRUISER
Int. Color:
Ext. Color:
Black
Trans:
Automatic
VIN:
JTEZU4BF7AK009445
Stock:
122821B
DIFFERENTIALBLACK
Status:
Body Style:
SUV
Engine:
Gas V6 4.0L/241
Dealership: Universal Toyota
$29,988*
Price
View More Information
Compare?
"""
从这个文本中,我需要提取“JTEZU4BF7AK009445”(长度为17)这个在vin后面的模式。
我使用了这个模式:
vin_pattern = re.compile('([A-Z0-9]{17})')
vin = re.findall(vin_pattern,text)
["JTEZU4BF7AK009445","DIFFERENTIALBLACK"]
但是DIFFERENTIALBLACK不应该被匹配。
我还使用了这个模式:
price_pat = re.compile('(\$[0-9\,\.]+)')
来匹配价格范围(“$”符号+数值)。
在这里,我需要检查这个价格匹配模式只在VIN_PATTERN出现的前后50个字符内。
因为在某些情况下,我可能有多个价格值。所以,我需要过滤出在这个VIN模式前后50个字符内的文本。
请问我该怎么做?
3 个回答
1
如果你不一定要用正则表达式(它们真的很麻烦),我推荐你使用下面的解决方案:
yourstr = """ ... whatever ... """
lst = yourstr.split()
vin = lst[lst.index('VIN:') + 1]
price = [i for i in lst if '$' in i][0]
我希望这个方法能满足你的需求!
1
这是个不太干净的解决办法,但确实能奏效。
import re
st = "....your string...."
x = re.findall(r"VIN:([^Stock]+)",st)
y = "".join(x)
y.strip(" \n")
print y
输出结果是 'JTEZU4BF7AK009445'
6
首先,我们来简化一下你的文本,把所有的空格都统一成一个空格:
t2 = re.sub(r'[\n\t\ ]+', ' ', t) # t is your original text
这样查找车辆识别码(VIN)就简单多了:
re.findall('[A-Z]{3}[A-Z0-9]{10}[0-9]{4}', t2)
Out[2]: ['JTEZU4BF7AK009445']
接下来,你可以找到VIN在你的字符串中的位置,然后把vin_position - 50和vin_position + 50传入.findall方法:
r2 = re.compile('(\$[0-9\,\.]+)')
r2.findall(t2, t2.find('VIN:') - 50, t2.find('VIN:') + 50)
Out[4]: []
在你的文本中,价格距离VIN有超过50个字符,也就是说你需要扩大这个范围(100个字符就很好):
r2.findall(t2, t2.find('VIN:') - 100, t2.find('VIN:') + 100)
Out[5]: ['$29,988']