为了账号安全,请及时绑定邮箱和手机立即绑定

正则表达式:如果字符被转义,则解析不同

正则表达式:如果字符被转义,则解析不同

浮云间 2023-06-06 10:16:07
鉴于此字符串"foo-bar=369,337,234,123",我可以['foo-bar', '369', '337', '234', '123]使用此正则表达式将其解析为:re.findall(r'[a-zA-Z0-9\-_\+;]+', 'foo-bar=369,337,234,123'),现在,如果我对字符串中的某些部分进行转义,例如"foo-bar=369\,337\,234,123",我希望它的解析方式有所不同:['foo-bar', '369\,337\,234', '123']。我尝试了下面的正则表达式,但它不起作用:r'[a-zA-Z0-9\-_\+;(\\,)]+'基本上是尝试将字符序列添加\,到要匹配的字符列表中。
查看完整描述

1 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

你可以使用

[a-zA-Z0-9_+;-]+(?:\\,[a-zA-Z0-9_+;-]+)*

请参阅正则表达式演示

如果您通过re.Are.ASCIIre.compile,您可以将其缩短为

[\w+;-]+(?:\\,[\w+;-]+)*

正则表达式详细信息

  • [\w+;-]+- 一个或多个单词+;-字符

  • (?:\\,[\w+;-]+)*- 0 次或多次出现\,后跟 1+ 个单词、+;字符的-子字符串。

Python 演示

import re

strings = [r'foo-bar=369,337,234,123', r'foo-bar=369\,337\,234,123']

rx = re.compile(r"[\w+;-]+(?:\\,[\w+;-]+)*", re.A)

for s in strings:

    print(f"Parsing {s}")

    print(rx.findall(s))

输出:


Parsing foo-bar=369,337,234,123

['foo-bar', '369', '337', '234', '123']

Parsing foo-bar=369\,337\,234,123

['foo-bar', '369\\,337\\,234', '123']

请注意此处的双反斜杠,在字符串文字内,表示单个文字反斜杠。


查看完整回答
反对 回复 2023-06-06
  • 1 回答
  • 0 关注
  • 60 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信