我在一些输入上使用这个正则表达式,
[^a-zA-Z0-9@#]
然而,这最终会删除输入中的大量 html 特殊字符,例如
#227;, #1606;, #1588; (i had to remove the & prefix so that it wouldn't
show up as the actual value..)
有没有办法可以将它们转换为它们的值,以便满足正则表达式?我也不知道为什么文本决定这么大。
我在一些输入上使用这个正则表达式,
[^a-zA-Z0-9@#]
然而,这最终会删除输入中的大量 html 特殊字符,例如
#227;, #1606;, #1588; (i had to remove the & prefix so that it wouldn't
show up as the actual value..)
有没有办法可以将它们转换为它们的值,以便满足正则表达式?我也不知道为什么文本决定这么大。
鉴于您的文本似乎具有数字编码而非命名实体,您可以首先将包含 xml 实体定义(与号、哈希、数字、分号)的字节字符串转换为 unicode:
import re
xed_re = re.compile(r'&#(\d+);')
def usub(m): return unichr(int(m.group(1)))
s = 'ã, ن, ش'
u = xed_re.sub(usub, s)
如果您的终端仿真器可以显示任意 unicode 字形,print u
则将显示
ã, ن, ش
在任何情况下,如果您愿意,您现在可以使用原始 RE,并且您不会意外“捕获”实体,只有 ascii 字母、数字和您列出的几个标点符号。(我不确定这是否是您真正想要的——例如,为什么不是重音字母而只是 ascii 字母?——但是,如果这是你想要的,它会起作用)。
如果除了数字编码的实体之外确实有命名实体,您还可以应用htmlentitydefs
另一个答案中推荐的标准库模块(但是,它只处理映射到 Latin-1 代码点的命名实体)。
您可以调整以下脚本:
import htmlentitydefs
import re
def substitute_entity (match):
name = match.group (1)
if name in htmlentitydefs.name2codepoint:
return unichr (htmlentitydefs.name2codepoint[name])
elif name.startswith ('#'):
try:
return unichr (int (name[1:]))
except:
pass
return '?'
print re.sub ('&(#?\\w+);', substitute_entity, 'x « y &wat; z {')
在这里产生以下答案:
x « y ? z {
编辑:我将问题理解为“如何在进一步处理之前摆脱 HTML 实体”,希望我没有浪费时间回答错误的问题;)
在不知道该表达式的用途的情况下,我无法准确说出您需要什么。
这将匹配特殊字符或字符串,不包括字母、数字、@ 和 #:
[^a-zA-Z0-9@#]*|#[0-9A-Za-z]+;