美丽的汤和正则表达式
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')
我没有对此进行测试,但您可能可以自己从这里继续。
【讨论】:
以上是关于美丽的汤和正则表达式的主要内容,如果未能解决你的问题,请参考以下文章