3

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

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

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

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

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

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

4

2 回答 2

3

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

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

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

于 2012-04-25T07:04:22.860 回答
3

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

[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}$
于 2012-04-25T07:06:02.770 回答