0

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

到目前为止,我使用

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]+[^+^-^>^<^=]*')

但也无济于事。

4

3 回答 3

2

您的模式应该适用于您的示例,但稍微更正您的模式以实际符合您的意图:

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

这匹配1 个首字母(小写或大写),后跟 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']
于 2013-03-26T12:35:51.977 回答
0

应该:

[a-zA-Z_][a-zA-Z0-9_.]*
于 2013-03-26T12:37:27.630 回答
0

除了为什么您的原始表达不适用于您的下划线之外,您的问题已经得到解答。如果你有图案

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

然后因为点它实际上相当于

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

因此与您的想法相反,这确实与您的“x_w_3_dummy_1”“x_b_1_0_0”相匹配。问题在于,由于点,它也会匹配您随后的分隔符,例如您的 +、-、>、< 和 = 以及它之后的任何内容。

于 2013-03-26T14:35:43.360 回答