我使用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”之类的数字。
我无法理解为什么所以我求助于你。
答案 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}$