python中的无效表达模式

时间:2019-01-15 13:29:19

标签: python regex python-3.x

例如,字符串为'10S#9D7T*'
我想要的结果是3个数组。 [('10S#'), ('9D'), ('7T*')]

有3个条件。

  1. 前一个或两个数字范围始终为0〜10。
  2. 并且总是跟随一个字符。
  3. 并遵循'#''*'。但这不是必需的。

那是我的代码。

rex = re.compile(r'\d?\d\w?[\*\#]')
str = '10S#9D7T'
print(rex.findall(str))

实际结果-> ['10S#']

只有一个数组。

请修复我的正则表达式模式。

2 个答案:

答案 0 :(得分:1)

通过将[*#]类设为可选,可以获得三个结果。 (此外,请注意,这些字符不需要转义。)

str = '10S#9D7T*'
rex = re.compile(r'\d?\d\w?[*#]?')
print(rex.findall(str))

结果:['10S#', '9D', '7T*']

关于第二条规则,“并且总是跟随一个字符”,您可能希望通过直接删除\w来使?为非可选。

r'\d?\d\w[*#]?'

答案 1 :(得分:1)

您可以将\d?\d更改为\d{1,2},并且由于以下字符始终存在,因此该字符不是可选的,因此可以省略问号。不必在字符类中转义*和#并在其上添加问号以使其成为可选。

您可以使用:

\d{1,2}\w[*#]?

这将匹配:

  • \d{1,2}匹配1-2位数字
  • \w匹配单词字符
  • [*#]?可选字符类,以匹配*或#

    之一

    导入 str =“ 10S#9D7T *” rex = re.compile(r'\ d {1,2} [A-Z] [*#]?') 打印(rex.findall(str))

结果

['10S#', '9D', '7T*']

Regex demo | Python demo