2014-10-18 102 views
0

我正在使用搜索&替換編程分配。我是一名學生,我發現正則表達式文檔有點壓倒性(例如https://docs.python.org/2/library/re.html),所以我希望這裏有人能向我解釋如何完成我期待的內容。Python /正則表達式分割特定格式的返回字符串

我用正則表達式從我的文檔中獲取字符串列表。他們都看起來像這樣:

%@import fileName (regexStatement) 

一個實際的例子:

%@import script_example.py (*out =(.|\n)*?return out) 

現在,我不知道我怎麼可以拆分這些,所以我得到的文件名和regexStatements作爲單獨的字符串。我假設使用正則表達式或字符串拆分函數,但我不知道如何使它適用於%@ import fileName(regexstatement)的各種變體。例如,使用圓括號進行分割可能會碰到正則表達式語句的中間,或者如果括號是fileName的一部分。該作業沒有指定它是否應該只能從python文件導入,所以我不相信我可以在「正則表達式」語句之前使用「.py(」作爲分割點。類似於正則表達式「%@ import」來導入導入後的空白,「\ .. *」擊中fileName之後的空白。但我不確定如何擺脫包圍正則表達式的括號,或者如何使用它的所有實際正確分割字符串,所以我有一個變量存儲文件名和一個存儲regexStatement在我的列表中的每個條目。

非常感謝您的關注!

+0

的文件名可以包含空格?如果不是,則不需要使用正則表達式。用maxsplit 2將空格分割爲空格,將第二部分作爲文件名,並將第三部分作爲正則表達式(修剪括號後)。 – BrenBarn 2014-10-18 18:14:22

+0

@BrenBarn哦,那可以工作。我會試試看。從未想過maxsplit。 – user2875994 2014-10-18 18:15:15

+0

@BrenBarn 你知道如何從匹配對象中獲取字符串嗎?我跑 'textToImport = re.search(regexStatement,fileName)' ,但我不知道如何從textToImport中獲取字符串(這只是一個matchobject,並且文檔沒有說遠我所看到的)。 – user2875994 2014-10-18 19:18:21

回答

0

如果文件名不能包含空格,只是分割你的字符串與maxsplit 2位:

>>> line.split(' ', 2) 
['%@import', 'script_example.py', '(*out =(.|\n)*?return out)'] 

的maxsplit 2使它只拆分前兩個空間,並留下完整的正則表達式中的任何空間。現在你有第二個元素的文件名和第三個正則表達式。從您的陳述中不清楚括號是否是正則表達式的一部分(即作爲捕獲組)。如果沒有,您可以通過修剪該部分的第一個和最後一個字符來輕鬆刪除它們。

如果分配的值是這樣的:

filename, regex = line.split(' ', 2)[1:] 

,那麼你可以用剝離括號:

regex = regex[1:-1] 
+0

我現在正在測試這個,我會盡快接受! – user2875994 2014-10-18 18:18:07

+0

太棒了,就分裂而言,這是有效的!這就是說我使用正則表達式,所以我的解決方案是re.split(r「\ s」,語句,2)其中語句是我分裂的字符串。儘管如何修剪括號? – user2875994 2014-10-18 18:46:40

+0

@ user2875994:看到我編輯的答案。爲什麼你想要使用正則表達式,如果你可以沒有一個呢? – BrenBarn 2014-10-18 18:48:43

0

應該這樣做很好

^%@import (\S+) \((.*)\) 

,或者,如果文件名可能有空格:

^%@import ((?:(?! \().)+) \((.*)\) 

這兩個表達式都包含兩個組,一個用於文件名,另一個用於括號內容。無論如何,如果您使用單行,則可以在整個文件中以多行模式運行,也可以在正常模式下運行。

此:((?:(?! \().)+)擊穿爲:

 
(   # group start 
    (?:   # non-capturing group 
    (?!  #  negative look-ahead: a position NOT followed by 
     \( #  " (" 
    )   #  end look-ahead 
    .   #  match any char (this is part of the filename) 
)+   # end non-capturing group, repeat 
)    # end group 

表達的其他位應該是不言自明的。


import re 

line = "%@import script_example.py (*out =(.|\\n)*?return out)" 
pattern = r'^%@import (\S+) \((.*)\)' 

match = re.match(pattern, line) 

if match: 
    print "match.group(1) '" + match.group(1) + "'" 
    print "match.group(2) '" + match.group(2) + "'" 
else: 
    print "No match." 

打印

 
match.group(1) 'script_example.py' 
match.group(2) ' *out =(.|\n)*?return out' 
0

對於像%@import script_example.py (*out =(.|\n)*?return out)匹配的東西,我建議:

r'%@impor[\w\W ]+' 

DEMO

需要注意的是:

\w match any word character [a-zA-Z0-9_] 
\W match any non-word character [^a-zA-Z0-9_] 

所以你可以使用re.findall()對發現的所有比賽:

​​
+0

我已經找到了字符串,那不是問題我在問:)如果你想知道我使用的正則表達式是r「%@ import。*」。 – user2875994 2014-10-18 18:42:42

+0

str.startswith只測試特定字符串的開始,據我所知,所以這不會工作:) – user2875994 2014-10-18 18:49:06

相關問題