查找由0到n个单词分隔的两个字符串最有效的正则表达式是什么?

2024-05-17 23:32:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用了一些排列,但它们看起来都很慢。简而言之,我要寻找的是“foo”和“bar”之间并没有任何分隔,一个单词边界,一个或两个单词,这两个单词可能是部分匹配的:

foobar -> Match
foo-bar -> Match
foo bar -> Match
foo biz bar -> Match
foo biz bang bar -> Match
foo biz bang bang bar -> No Match
foo-biz bar -> Match
FoO, bAr -> Match
Foos Baring -> Match
Foobizbangbarnit -> No match
Foobizbar -> Match
Arfoo bar -> No match
...

实际上,我需要匹配几个组合:

ant, bee
ant, cat
ant, dog
elephant, bee
elephant, cat
frog, bee
frog, cat
frog, dog
goat, hedgehog

在大约30亿个文本片段中包含大约200个组合的列表。使用:

r'\bant\W{0,4}(\w*|\w+\W+\w+|\w+\W+\w+\W+\w+)(bee|cat|dog)|' +
r'\belephant\W{0,4}(\w*|\w+\W+\w+|\w+\W+\w+\W+\w+)(bee|cat)|' +
r'\bfrog\W{0,4}(\w*|\w+\W+\w+|\w+\W+\w+\W+\w+)(bee|cat|dog)|' +
r'\bgoat\W{0,4}(\w*|\w+\W+\w+|\w+\W+\w+\W+\w+)hedgehog'

工作正常,但速度非常慢(大约慢1500小时)。不幸的是,这些组合并不容易嵌套。我正在尝试创建更快的更自由的正则表达式,这样我就可以将30亿个片段配对到预期的300-400万个片段,然后在子集上运行更严格的正则表达式,但是任何想法都是受欢迎的。有什么建议吗


Tags: nofoomatchbar单词catbeehedgehog
1条回答
网友
1楼 · 发布于 2024-05-17 23:32:04

首先,和评论一样的问题,为什么foo biz bang bang bar不匹配?你希望把bar放在哪里?你的例子把我弄糊涂了

也许您可以将一个正则表达式拆分为两个,然后将每个候选字符串与两个表达式匹配(这种拆分是否有效取决于您对bar位置的限制,似乎您希望foo始终位于字符串的开头)?这样做可以避免在中间匹配字符

例如:foo...bar->^(?i)foo+(?i)bar,((?i)代表case insensitive

相关问题 更多 >