我使用了一些排列,但它们看起来都很慢。简而言之,我要寻找的是“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万个片段,然后在子集上运行更严格的正则表达式,但是任何想法都是受欢迎的。有什么建议吗
首先,和评论一样的问题,为什么
foo biz bang bang bar
不匹配?你希望把bar
放在哪里?你的例子把我弄糊涂了也许您可以将一个正则表达式拆分为两个,然后将每个候选字符串与两个表达式匹配(这种拆分是否有效取决于您对
bar
位置的限制,似乎您希望foo
始终位于字符串的开头)?这样做可以避免在中间匹配字符例如:
foo...bar
->^(?i)foo
+(?i)bar
,((?i)
代表case insensitive)相关问题 更多 >
编程相关推荐