簡體   English   中英

正則表達式與下划線匹配

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM