在Python中对表达式应用多个负正则表达式
这个问题类似于,除了匹配一个正则表达式并做一些事情之外,我需要确保我没有匹配一组正则表达式,如果没有找到匹配项(也就是说我有有效数据),那么就做一些事情。我已经找到了一种方法,但我认为一定有更好的方法,特别是如果我最终得到了许多正则表达式 基本上,我是在过滤URL中的不好的东西(“,\ \”,等等),当我从HTML文档中拉出看起来像是有效的URL的东西,但它是JavaScript的一部分(因此需要进行评估,因此需要转义字符)。我不能使用Beauty soup来处理这些页面,因为它们很容易损坏(实际上,我使用BeautifulSoup,然后回到我丑陋但可行的解析器) 到目前为止,我发现以下方法效果相对较好:我在主循环之外编译了一个dict或正则表达式(因此我只需编译一次,但每次使用它时都会受益于速度的提高),然后通过这个dict循环一个URL,如果有匹配,则URL是坏的,如果没有,则URL是好的:在Python中对表达式应用多个负正则表达式,python,regex,coding-style,Python,Regex,Coding Style,这个问题类似于,除了匹配一个正则表达式并做一些事情之外,我需要确保我没有匹配一组正则表达式,如果没有找到匹配项(也就是说我有有效数据),那么就做一些事情。我已经找到了一种方法,但我认为一定有更好的方法,特别是如果我最终得到了许多正则表达式 基本上,我是在过滤URL中的不好的东西(“,\ \”,等等),当我从HTML文档中拉出看起来像是有效的URL的东西,但它是JavaScript的一部分(因此需要进行评估,因此需要转义字符)。我不能使用Beauty soup来处理这些页面,因为它们很容易损坏(实
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“或”(“|”)”,即:
这减少了比较和诸如此类的次数,但使故障排除变得更加困难(通过每个比较一个表达式,我可以轻松添加打印语句,如:
print "URL: ", url, " matched by key ", key
那么,是否有什么方法可以在充分利用这两个方面的优势(即比较次数最少)的同时仍然能够打印出与URL匹配的正则表达式,或者我只是需要咬紧牙关,在调试时让我的代码速度较慢,但更容易进行故障排除,然后将所有正则表达式一起放入一行进行生产?(这意味着编程和代码维护还有一个步骤以及可能出现的问题)
更新:
Dave Webb给出了一个很好的答案,因此实际代码如下所示:
match = re.search(r'(?P<double_quotes>\"\")|(?P<slash_quote>\\\")', fullurl)
if (match == None):
# do stuff here ...
else:
#optional for debugging
print "url matched by", match.lastgroup
match=re.search(r'(?P\\”)|(?P\\”),完整URL)
如果(匹配==无):
#在这里做事。。。
其他:
#用于调试的可选选项
打印“url匹配人”,match.lastgroup
“Squoosh”将所有正则表达式放在一行中,但将每个正则表达式放在一个命名组中,然后使用查找匹配的正则表达式
match = re.search(r'(?P<double_quotes>\"\")|(?P<slash_quote>\\\")', fullurl)
if (match == None):
# do stuff here ...
else:
#optional for debugging
print "url matched by", match.lastgroup