为什么这个正则表达式不起作用?

时间:2014-02-20 13:42:16

标签: python html regex

我有一个解析HTML代码的函数,因此很容易阅读和编写。为了做到这一点,我必须用多个分隔符分割字符串,你可以看到我使用re.split(),我找不到更好的解决方案。但是,当我提交一些像this这样的HTML时,它绝对没有效果。这让我相信我的正则表达式写得不正确。那应该是什么?

def parsed(data):
    """Removes junk from the data so it can be easily processed."""
    data = str(data)
    # This checks for a cruft and removes it if it exists.
    if re.search("b'", data):
        data = data[2:-1]
    lines = re.split(r'\r|\n', data)  # This clarifies the lines for writing.
    return lines

如果你发现类似的问题,这不是重复的,我已经爬了好几年了,但它仍然不起作用。

1 个答案:

答案 0 :(得分:2)

您正在将bytes值转换为字符串:

data = str(data)
# This checks for a cruft and removes it if it exists.
if re.search("b'", data):
    data = data[2:-1]

表示所有行分隔符都已转换为Python转义码:

>>> str(b'\n')
"b'\n'"

这是一个文字b,字面引用,文字\反斜杠,文字n,字面引用。您必须在r'(\\n|\\r)'上进行拆分,但最重要的是,您不应在此处将字节值转换为字符串表示形式。 Python将字节值的表示生成为可以粘贴回Python解释器的文字字符串,这与对象中包含的不同。 / p>

您希望将解码改为字符串:

if isinstance(data, bytes):
    data = data.decode('utf8')

我假设数据是用UTF8编码的。如果这是来自Web请求的数据,则响应标头通常包含用于对Content-Type标头中的数据进行编码的字符集,请查找charset=参数。

urllib.request模块生成的响应具有.info()方法,并且可以提取字符集(如果提供):

charset = response.info().get_param('charset')

如果没有提供字符集,则返回值为None

您不需要使用正则表达式来分割线条,str类型有专门的方法,str.splitlines()

  

返回字符串中的行列表,在行边界处断开。此方法使用通用换行符方法来拆分行。除非给出了keepends并且为true,否则换行符不会包括在结果列表中。

     

例如,'ab c\n\nde fg\rkl\r\n'.splitlines()会返回['ab c', '', 'de fg', 'kl'],而splitlines(True)的同一回复会返回['ab c\n', '\n', 'de fg\r', 'kl\r\n']