Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python正则表达式-可选匹配_Python_Regex - Fatal编程技术网

python正则表达式-可选匹配

python正则表达式-可选匹配,python,regex,Python,Regex,我有一堆这样的字符串: #q1_a1 #q7 基本上,这是一个必须忽略的迹象。 之后是一个字母加上一些数字。 或者,可以在uuUnderbar后面跟随一些字母+数字组合 以下是我的想法: >>> pat = re.compile(r"#(.*)_?(.+)?") >>> pat.match('#q1').groups() ('q1', None) 问题是q1_a1格式的字符串。当我将我所做的应用于这些字符串时: >>> pat.finda

我有一堆这样的字符串:

#q1_a1
#q7
基本上,这是一个必须忽略的迹象。 之后是一个字母加上一些数字。 或者,可以在uuUnderbar后面跟随一些字母+数字组合

以下是我的想法:

>>> pat = re.compile(r"#(.*)_?(.+)?")
>>> pat.match('#q1').groups()
('q1', None)
问题是q1_a1格式的字符串。当我将我所做的应用于这些字符串时:

>>> pat.findall('#q1_f1')
[('q1_f1', '')]

有什么建议吗

您的.*匹配也会加下划线,因为匹配是贪婪的。最好创建更具体的正则表达式,从第一个组中排除下划线

适当的正则表达式可以如下所示:

#([a-z][0-9])_?([a-z][0-9])?
但是,您需要检查它是否适用于您期望的所有数据

在正则表达式中更具体一些更好,因为误报更少。

使用。*时,它会尽可能多地匹配。尝试:

>>> pat = re.compile(r"#([^_]*)_?(.+)?")
>>> pat.findall('#q1_f1')
[('q1', 'f1')]
此外,最好编写一个更具体的表达式:

#([a-z][0-9])(?:_([a-z][0-9]))?

不使用正则表达式的简单替代方法:

s = '#q7'
print s[1:].split('_')
# ['q7']

s = '#q1_a1'
print s[1:].split('_')
# ['q1', 'a1']
这是假设所有字符串都以开头。如果不是这样,那么您可以轻松地进行一些验证:

s = '#q1_a1'
if s.startswith('#'):
    print s[1:].split('_')
# ['q1', 'a1]

s = 'q1_a1'
if s.startswith('#'):
    print s[1:].split('_')  # Nothing is printed

正如其他人所说,您的正则表达式越具体,就越不可能匹配不应该匹配的内容:

In [13]: re.match(r'#([A-Za-z][0-9])(?:_([A-Za-z][0-9]))?', '#q1_a1').groups()
Out[13]: ('q1', 'a1')

In [14]: re.match(r'#([A-Za-z][0-9])(?:_([A-Za-z][0-9]))?', '#q1').groups()
Out[14]: ('q1', None)
注:

如果只需要匹配整个字符串,请在正则表达式周围加上^和$。 你说了一些数字,但你的例子只包含一个数字。如果您的正则表达式需要接受多个数字,请将[0-9]更改为[0-9]+。
这个数字是个位数吗?还有,这个字母总是小写的吗?