美丽的汤和正则表达式

时间:2012-04-25 06:50:06

标签: python regex beautifulsoup

我使用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”之类的数字。

我无法理解为什么所以我求助于你。

2 个答案:

答案 0 :(得分:3)

IIUC,你的字符串中总是有一个“J”。 因此,强制使用,并使用问号使“C”可选。 类似的东西:

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

我没有对此进行过测试,但您可以自己继续这样做。

答案 1 :(得分:3)

您尚未指定|适用的内容;默认情况下,这是整个正则表达式,这意味着你要求

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

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

相同
CJ[0-9]{4}

not [CJ],意思是“C或J”)。使用括号指定替代方案:

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

哪个更好写

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