簡體   English   中英

python正則表達式:多線和非貪婪

[英]python regex: multiline and non-greedy

我有這樣的文字:

cc.Action = {
};

cc.FiniteTimeAction = {

};

cc.Speed = {

};

而我想要的結果(列表)是:

['cc.Action = {}', 'cc.FiniteTimeAction = {}', 'cc.Speed = {}']

以下是我的嘗試:

input = codecs.open(self.input_file, "r", "utf-8")
content = input.read()
result = re.findall('cc\..*= {.*};', content, re.S)
for r in result:
    print r
    print '---------------'

結果是:

[
'cc.Action = {
};

cc.FiniteTimeAction = {

};

cc.Speed = {

};'
]

任何建議將不勝感激,謝謝:)

比賽的開始似乎是cc. 比賽結束似乎是; 所以我們可以使用模式:

'cc\.[^;]+'

意思是,我們匹配cc. 然后匹配每個不是的字符; []包含字符類, ^否定類)。

你也可以使用非貪婪的重復*? ,但在這種情況下,我會說這是一個矯枉過正。 正則表達式越簡單越好。

要獲得所需的輸入,您還必須擺脫換行符。 我一起建議:

result = re.findall('cc\.[^;]*;', content.replace('\n', ''))

問題是,你正在使用貪婪的搜索。 你需要使用非貪婪的搜索? 操作者

import re
print [i.replace("\n", "") for i in re.findall(r"cc\..*?{.*?}", data, re.DOTALL)]
# ['cc.Action = {}', 'cc.FiniteTimeAction = {}', 'cc.Speed = {}']

如果你不使用.*? .*{將匹配到字符串中的最后一個{ 因此,所有字符串都被視為單個字符串。 當你進行非貪婪的比賽時,它會匹配到第一個{來自當前角色。

此外,這可以在不使用RegEx的情況下完成,就像這樣

print [item.replace("\n", "") for item in data.split(";") if item]
# ['cc.Action = {}', 'cc.FiniteTimeAction = {}', 'cc.Speed = {}']

只需基於分割字符串; 如果當前字符串不為空,則用空字符串替換所有\\n (換行符)。

正如你的標題所示,問題是貪婪: cc\\..*=從字符串的開頭到最后的 =匹配。

您可以通過使用延遲量詞來避免此行為,該量詞將嘗試在最早出現的下一個字符時停止:

cc\..*?= {.*?};

在這里演示: http//regex101.com/r/oL4yG7

如果你基於分裂;

codes.split(';')

輸出:

['cc.Action = {}', ' cc.FiniteTimeAction = {}', 'cc.Speed = {}', '']
>>> 'cc.Action = {\n};\n\ncc.FiniteTimeAction = {\n\n};\n\ncc.Speed = {\n\n};'.replace('\n','').split(";")
['cc.Action = {}', 'cc.FiniteTimeAction = {}', 'cc.Speed = {}', '']

這對你有用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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