[英]Regular Expression Matching With Underscores
我正在使用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'oder'C2000001'。 但不是'x_w_3_dummy_1'。 我原以為它可能仍然是因為下划線但它似乎與變量'x_b_1_0_0'一起工作得很好。
有沒有人知道可能會導致什么,更重要的是,如何解決它?
順便說一句,我也試過了
var_pattern = re.compile(r'[a-z|A-Z]+[^+^-^>^<^=]*')
但無濟於事。
您的模式應該適用於您的示例,但要稍微糾正您的模式以實際符合您的意圖:
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']
應該:
[a-zA-Z_][a-zA-Z0-9_.]*
除了您的原始表達不適用於您的下划線之外,您的問題已經得到了解答。 如果你有模式
r'[a-zA-Z][a-zA-Z0-9_.]*'
那么因為它實際上相當於
r'[a-zA-Z].*'
所以與你的想法相反,這確實匹配你的“x_w_3_dummy_1” 和你的“x_b_1_0_0”。 問題是因為它也會與你的后續分隔符匹配,比如你的+, - ,>,<和=以及之后的任何分隔符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.