ss=''鞍山市立山区胜利北路号-S'
res=re.findall('(&#x.*?)',sss)
res
['&#x', '&#x', '&#x', '&#x']
我想匹配    ,但是总是匹配出来是空,求大佬
我要匹配的是4个不是3个
ss=''鞍山市立山区胜利北路号-S'
res=re.findall('(&#x.*?)',sss)
res
['&#x', '&#x', '&#x', '&#x']
我想匹配    ,但是总是匹配出来是空,求大佬
我要匹配的是4个不是3个
这是 html 的 16 进制 unicode 转义,可以用 r'&#x[\da-f]+'
提取出来
s = '鞍山市立山区胜利北路号-S'
print(re.findall(r'&#x[\da-f]+', s, re.IGNORECASE))
# ['', '', '', '']
html 的 16 进制 unicode 转义允许不以 ;
结束,只要匹配到非 16 进制即可结束,且不区分大小写
s = 'g'
print(re.findall(r'&#x[\da-f]+', s, re.IGNORECASE))
# ['', '']
但如果要替换,还是得匹配掉 ;
,如解码
s = 'a-z'
print(re.sub(r'&#x([\da-f]+);?', lambda m: chr(int(m[1], 16)), s, 0, re.IGNORECASE))
# a-z
PS:如果字体库不遵循 unicode 规范,那么这个编码自然也不是 unicode(如字体反爬)
2 回答1.3k 阅读✓ 已解决
1 回答542 阅读
1 回答517 阅读
re.findall('(&#x.*?)(?=;)',sss)
*?
会匹配尽可能少的字符。空串是字符最少的,并且可以匹配。那么.*?
自然就只匹配一个空串了。(?=;)
是 lookahead ,要求后续串可以匹配;
。这样.*?
必须匹配到四个 hex 字符,然后后面才能匹配到;
。re