我正在使用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]+[^+^-^>^<^=]*')
但无济于事。
答案 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;和=以及之后的任何事情。