0

私はPythonのreパッケージ(正規表現がより一般的であることは知っていますが、他のパッケージがあるかもしれません)を使用して、変数名の後に+、-、>、<または=。(これは不等式のシステムです。)変数名を除外する必要があります。

今まで使っていた

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

あまり一般的ではないので、これはやや「ハッキー」です。私は気にしませんでしたが、以下のような奇妙な名前の問題に遭遇しました。

私の次の行きは

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

これは、少なくとも1つの頭文字の後に、+、-、>、<、および=を除いて発生するほぼすべてのものと一致する必要があります。これは、「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 に答える