我有以下python代码:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import re
line = 'div><div class="fieldRow jr_name"><div class="fieldLabel">name<'
regex0 = re.compile('(.+?)\v class="fieldLabel">name.+?', re.VERBOSE | re.UNICODE)
regex1 = re.compile('(.+?)v class="fieldLabel">name.+?', re.VERBOSE | re.UNICODE)
regex2 = re.compile('(.+?) class="fieldLabel">name.+?', re.VERBOSE | re.UNICODE)
m0 = regex0.match(line)
m1 = regex1.match(line)
m2 = regex2.match(line)
if m0:
print 'regex0 is good'
else:
print 'regex0 is no good'
if m1:
print 'regex1 is good'
else:
print 'regex1 is no good'
if m2:
print 'regex2 is good'
else:
print 'regex2 is no good'
输出
regex0 is good
regex1 is no good
regex2 is good
我不太明白为什么我需要在regex0中的“(。+?)”之后转义字符'v'。如果我没有逃脱,这将成为regex1,那么匹配将失败。但是,对于regex3中“(。+?)”之后的空格,我不必逃避。
有什么想法吗?
提前致谢。
答案 0 :(得分:3)
因此,您的方法存在一些问题 对您的具体投诉有贡献的是:
r'
前缀) - 这会使Python编译器在字符串内部更改一些前缀字符,然后再进行re.match调用。所以,你有匹配regex0:字母“v”os似乎从来没有这样。
现在,对于您可能的修复方法,按照您应该尝试执行的顺序:
1)不要使用正则表达式来解析HTML。真。有很多软件包可以很好地解析HTML,而且缺少那些可以使用stdlib自己的HTMLParser
(Python3中的html.parser
);
2)如果可能的话,使用Python 3而不是Python 2 - 如果继续使用将Python2字符串视为“真实”文本的天真方法,您将被咬到HTML体内的第一个非ASCII字符。 Python 3自动编码处理(当它不是自动时允许显式设置)。
由于您可能无论如何都没有改变,因此请尝试使用regex.findall
而不是regex.match
- 这将返回匹配字符串的列表,并且可以检索您正在查看的属性,而无需搜索打开文件,或者取决于HTML中的换行符。
答案 1 :(得分:0)
Python regex \ v中有一个特殊的符号,你可以在这里阅读: https://docs.python.org/2/library/re.html
Python正则表达式通常用r'your regex'
块编写,其中&#34; r&#34;表示原始字符串。 (https://docs.python.org/3/reference/lexical_analysis.html)
在您的代码中,所有特殊字符都应转义为普通字符。例如。如果你写s - 这是空格,\ s只是&#34; s&#34;。为了使它以相反的方式工作,使用原始字符串。 我相信下面这一行是你需要的解决方案。
regex1 = re.compile(r'(.+?)v class="fieldLabel">name.+?', re.VERBOSE | re.UNICODE)