这个问题类似于"How to concisely cascade through multiple regex statements in Python",除了不是匹配一个正则表达式,而是做一些事情,我需要确保我没有匹配一堆正则表达式,如果没有找到匹配(也就是我有有效的数据),然后做一些事情。我已经找到了一种方法,但我认为一定有更好的方法,特别是如果我最终使用了许多正则表达式。
基本上,我是在过滤URL中的坏东西(“”,\”等),当我从HTML文档中拉出看起来像是有效的URL,但它原来是JavaScript的一部分(因此需要进行评估,因此需要转义字符)。我不能使用BeautifulSoup来处理这些页面,因为它们太乱了(实际上我使用BeautifulSoup,然后回到我的丑陋但可行的解析器)。
到目前为止,我发现以下作品相对较好:我在主循环之外编译一个dict或正则表达式(所以我只需要编译一次,但每次使用它都会受益于速度的提高),然后我通过这个dict循环一个URL,如果有匹配,那么URL是坏的,如果没有,URL是好的:
regex_bad_url = {"1" : re.compile('\"\"'),
"2" : re.compile('\\\"')}
字符串
随后是:
url_state = "good"
for key, pattern in regex_bad_url_components.items():
match = re.search(pattern, url)
if (match):
url_state = "bad"
if (url_state == "good"):
# do stuff here ...
型
现在显而易见的想法是使用regex“或”(“|”),即:
re.compile('(\"\"|\\\")')
型
这减少了比较和诸如此类的数量,但使其更难解决问题(每个比较一个表达式,我可以轻松地添加一个print语句,如:
print "URL: ", url, " matched by key ", key
型
那么,有没有什么方法可以做到两全其美呢?最小数量的比较),但仍然能够打印出哪个正则表达式匹配的URL,或者我只是需要咬紧牙关,让我的速度较慢,但更容易故障排除代码时调试,然后squoosh所有的正则表达式一起到一行生产?(这意味着多了一个编程和代码维护的步骤以及可能出现的问题)。
1条答案
按热度按时间iszxjhcz1#
将所有正则表达式“Squoosh”到一行中,但使用
(?P<name>...)
将每个正则表达式放入一个命名组中,然后使用MatchOjbect.lastgroup
查找匹配的正则表达式。