regex 在Python中对表达式应用多个负正则表达式

xjreopfe  于 2023-08-08  发布在  Python
关注(0)|答案(1)|浏览(120)

这个问题类似于"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所有的正则表达式一起到一行生产?(这意味着多了一个编程和代码维护的步骤以及可能出现的问题)。

iszxjhcz

iszxjhcz1#

将所有正则表达式“Squoosh”到一行中,但使用(?P<name>...)将每个正则表达式放入一个命名组中,然后使用MatchOjbect.lastgroup查找匹配的正则表达式。

相关问题