正则表达式与下划线匹配

时间:2013-03-26 12:32:58

标签: python regex

我正在使用Python的重新包(是的我知道正则表达式更通用,但谁知道,可能还有其他包)来读取一些数据,其中包括带有变量名的不等式,之后来+, - ,>,<或=。 (它是一个不等式系统。)我需要过滤掉变量名。

到目前为止,我用过

var_pattern = re.compile(r'[a-z|A-Z]+\d*\.?')

有些' hacky'因为它不太笼统。我不介意,但遇到了如下奇怪名字的问题。

我的下一步是

var_pattern = re.compile(r'[a-z|A-Z]+[a-zA-Z0-9_.]*')

在至少一个首字母之后,应该匹配除了+, - ,>,<之外发生的所有事情。和=。这适用于变量名称,如' x23'奥德' C2000001。'但不能使用' x_w_3_dummy_1'。我原以为它可能仍然是因为下划线但它似乎与变量' x_b_1_0_0'一起工作得很好。

有没有人知道可能会导致什么,更重要的是,如何解决它?

顺便说一下,我也试过

var_pattern = re.compile(r'[a-z|A-Z]+[^+^-^>^<^=]*')

但无济于事。

3 个答案:

答案 0 :(得分:2)

你的模式应该适用于你的例子,但是稍微纠正你的模式以实际符合你的意图:

r'[a-zA-Z][a-zA-Z0-9_]*'

这匹配 1 首字母(lower或uppcase),后跟0或更多字母,数字和下划线。您的版本有一个多余的+,其中|包含在第一个字符允许的内容中,.包含其余名称。

显示此匹配的演示符合您的所有样本:

>>> import re
>>> names = ('x23', 'C2000001', 'x_w_3_dummy_1', 'x_b_1_0_0')
>>> var_pattern = re.compile(r'[a-zA-Z][a-zA-Z0-9_]*')
>>> for name in names:
...     print var_pattern.search(name).group()
... 
x23
C2000001
x_w_3_dummy_1
x_b_1_0_0

该模式与可能跟随变量名称的任何+-><=字符不匹配:

>>> var_pattern.findall('x23<10\nC2000001=24\nx_w_3_dummy_1+15\nx_b_1_0_0-5')
['x23', 'C2000001', 'x_w_3_dummy_1', 'x_b_1_0_0']

答案 1 :(得分:0)

应该是:

[a-zA-Z_][a-zA-Z0-9_.]*

答案 2 :(得分:0)

您的问题已经得到解答,除了您的原始表达与您的下划线不起作用的原因。如果你有模式

r'[a-zA-Z][a-zA-Z0-9_.]*'

然后因为它实际上相当于

r'[a-zA-Z].*'

与您的想法相反,这确实与您的&#34; x_w_3_dummy_1&#34; 您的&#34; x_b_1_0_0&#34;。问题是,由于点,它也会匹配您的后续分隔符,例如+, - ,&gt;,&lt;和=以及之后的任何事情。