我希望刪除用于解析的規(guī)則中的最后一條語句。語句用@字符封裝,規(guī)則本身用模式標(biāo)簽封裝。我想要做的只是刪除最后一條規(guī)則語句。我目前實(shí)現(xiàn)這一目標(biāo)的想法是這樣的:打開規(guī)則文件,將每一行作為一個元素保存到列表中。選擇包含正確規(guī)則 ID 的行,然后將規(guī)則模式另存為新字符串。反轉(zhuǎn)保存的規(guī)則模式。刪除最后一條規(guī)則語句。重新反轉(zhuǎn)規(guī)則模式。添加尾隨模式標(biāo)記。所以輸入看起來像:<pattern>@this is a statement@ @this is also a statement@</pattern>輸出將如下所示:<pattern>@this is a statement@ </pattern>我目前的嘗試是這樣的:with open(rules) as f: lines = f.readlines()string = ""for line in lines: if ruleid in line: position = lines.index(line) string = lines[position + 2] # the rule pattern will be two lines down # from where the rule-id is located, hence # the position + 2def reversed_string(a_string): #reverses the string return a_string[::-1] def remove_at(x): #removes everything until the @ character return re.sub('^.*?@','',x) print(reversed_string(remove_at(remove_at(reversed_string(string)))))這將反轉(zhuǎn)字符串,但不會刪除最后一條規(guī)則語句,一旦它被反轉(zhuǎn)。僅運(yùn)行該reversed_string()函數(shù)將成功反轉(zhuǎn)字符串,但嘗試通過該remove_at()函數(shù)運(yùn)行相同的字符串將根本不起作用。但是,如果您手動創(chuàng)建輸入字符串(到相同的規(guī)則模式),并放棄打開和抓取規(guī)則模式,它將成功刪除尾隨的規(guī)則語句。成功的代碼如下所示:string = '<pattern>@this is a statement@ @this is also a statement@</pattern>'def reversed_string(a_string): #reverses the string return a_string[::-1] def remove_at(x): #removes everything until the @ character return re.sub('^.*?@','',x) print(reversed_string(remove_at(remove_at(reversed_string(string)))))另外,刪除完成后如何添加模式標(biāo)簽?
1 回答

HUH函數(shù)
TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超4個贊
您正在閱讀的行可能\n
在末尾有一個,這就是您的替代品不起作用的原因。這個問題可以指導(dǎo)您閱讀沒有換行的文件。
在這些選項(xiàng)中,一個可能是像這樣刪除\n
using?rstrip() :
string?=?lines[position?+?2].rstrip("\n")
現(xiàn)在,關(guān)于替換,我認(rèn)為你可以使用這個正則表達(dá)式來簡化它:
@[^@]+@(?!.*@)
它由以下部分組成:
@[^@]+@
匹配一個@
后跟一個或多個不是an的字符@
,然后是另一個@
。(?!.*@)
是一個否定的先行檢查,以檢查@
前面沒有找到任何其他字符的零次或多次出現(xiàn)。
此表達(dá)式應(yīng)與最后一條語句匹配,您不需要反轉(zhuǎn)字符串:
re.sub("@[^@]+@(?!.*@)",?"",?string)
添加回答
舉報
0/150
提交
取消