如何用正则表达式过滤文本行中的字符串模式?

2 投票
3 回答
17871 浏览
提问于 2025-04-17 09:40

我需要在给定的文本中用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']

撰写回答