python3 正则问题

ss=''鞍山市立山区胜利北路号-S&#xf1a2'

res=re.findall('(&#x.*?)',sss)
res
['&#x', '&#x', '&#x', '&#x']
我想匹配&#xf74a  &#xf5c6   &#xf1a5  &#xf1a2  ,但是总是匹配出来是空,求大佬

我要匹配的是4个不是3个
阅读 2.5k
3 个回答

re.findall('(&#x.*?)(?=;)',sss)


*? 会匹配尽可能少的字符。空串是字符最少的,并且可以匹配。那么 .*? 自然就只匹配一个空串了。

(?=;) 是 lookahead ,要求后续串可以匹配 ;。这样 .*? 必须匹配到四个 hex 字符,然后后面才能匹配到 ;

re

零宽断言
image.png
增加子模式
image.png

这是 html 的 16 进制 unicode 转义,可以用 r'&#x[\da-f]+' 提取出来

s = '鞍山市立山区胜利北路号-S&#xf1a2'
print(re.findall(r'&#x[\da-f]+', s, re.IGNORECASE))
# ['&#xf74a', '&#xf5c6', '&#xf1a5', '&#xf1a2']

html 的 16 进制 unicode 转义允许不以 ; 结束,只要匹配到非 16 进制即可结束,且不区分大小写

s = '&#xf74ag&#XF1A2'
print(re.findall(r'&#x[\da-f]+', s, re.IGNORECASE))
# ['&#xf74a', '&#XF1A2']

但如果要替换,还是得匹配掉 ;,如解码

s = 'a-&#x7a'
print(re.sub(r'&#x([\da-f]+);?', lambda m: chr(int(m[1], 16)), s, 0, re.IGNORECASE))
# a-z

PS:如果字体库不遵循 unicode 规范,那么这个编码自然也不是 unicode(如字体反爬)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进