【问题标题】:Beautiful Soup and regular expressions美丽的汤和正则表达式
【发布时间】:2012-05-05 20:15:27
【问题描述】:

我正在使用 Beautiful Soup 来识别特定标签及其内容。内容是 html 链接,我想提取这些标签的文本。

问题是文本是根据特定的模式由不同的数字组成的。我只对“61993J0417”和“61991CJ0316”等数字感兴趣,当数字中间有“J”和“CJ”时,我需要正则表达式来匹配。

我已使用此代码来实现此目的:

soup.find_all(text=re.compile('[6][1-2][0-9]{3}[J]|[CJ][0-9]{4}'))

soup 变量是特定标签的内容。此代码适用于 10 个案例中的 9 个。但是,当我在我的一个源文件上运行此脚本时,它也会匹配诸如“51987PC0716”之类的数字。

我不明白为什么,所以我向你寻求帮助。

【问题讨论】:

  • 在特定文件中,此正则表达式产生四个错误匹配:51987PC0716、51992PC0405、51992PC0405-C 和 51992PC0405-A09。如果我将正则表达式更改为'^[6][1-2][0-9]{3}[J]|[CJ][0-9]{4}$',它只会犯两个错误并匹配51987PC0716和51992PC0405。

标签: python regex beautifulsoup


【解决方案1】:

您尚未指定| 适用于什么;默认情况下,它是整个正则表达式,这意味着您已经要求任何一个

[6][1-2][0-9]{3}[J]

(与6[12][0-9]{3}J相同)

CJ[0-9]{4}

不是 [CJ],意思是“C 或 J”)。使用括号指定备选方案:

^6[12][0-9]{3}(J|CJ)[0-9]{4}$

哪个写的更好

^6[12][0-9]{3}C?J[0-9]{4}$

【讨论】:

    【解决方案2】:

    IIUC,你的字符串中总是有一个“J”。 因此,将其设为必填,并使用问号将“C”设为可选。 比如:

    re.compile('6[1-2][0-9]{3}C?J[0-9]{4}')
    

    我没有对此进行测试,但您可能可以自己从这里继续。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-21
      • 2013-04-09
      • 2013-06-29
      • 1970-01-01
      • 2014-09-05
      • 2017-12-14
      • 1970-01-01
      相关资源
      最近更新 更多