美丽的汤和正则表达式

Posted

技术标签:

【中文标题】美丽的汤和正则表达式【英文标题】: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。 【参考方案1】:

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

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

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

CJ[0-9]4

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

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

哪个写的更好

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

以上是关于美丽的汤和正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

美丽的汤类型错误和正则表达式

美丽的汤正则表达式

如果类“包含”或正则表达式,那么美丽的汤?

美丽的汤正则表达列表中的Python循环[重复]

美丽的汤和uTidy

美丽的汤和提取价值