這是一種不同的方式,它使用tokenize.generate_tokens識別Python字符串。標記化模塊使用正則表達式;所以通過使用tokenize
,您可以將複雜的骯髒工作留給Python本身。通過使用更高級別的函數,您可以更正確地使用正則表達式(並避免重新發明輪子)。此外,這可以正確識別各種Python字符串(例如單引號,雙引號和三引號類型的字符串),而不會被註釋混淆。
import tokenize
import token
import io
import collections
class Token(collections.namedtuple('Token', 'num val start end line')):
@property
def name(self):
return token.tok_name[self.num]
text = r'''foo = 1 "this is \"my string\", which ends here" bar'''
for tok in tokenize.generate_tokens(io.BytesIO(text).readline):
tok = Token(*tok) # 1
if tok.name == 'STRING': # 2
print(tok.val)
- tokenize.generate_tokens返回元組。令牌類允許你 以更好的方式訪問元組中的信息。
- 特別是,每個令牌都有一個名稱,如'STRING','NEWLINE', 'INDENT'或'OP'。你可以用它來識別Python字符串。
編輯:我喜歡使用令牌類,所以我沒有寫 token.tok_name[num]
在很多地方。然而,對於上面的代碼,它可能是更清晰,更容易忘記Token類和只寫中心思想明確:
import tokenize
import token
import io
text = r'''foo = 1 "this is \"my string\", which ends here" bar'''
for num, val, start, end, line in tokenize.generate_tokens(io.BytesIO(text).readline):
if token.tok_name[num] == 'STRING':
print(val)
http://stackoverflow.com/questions/14366401/correctly-parsing-string-literals-with-pythons -re-module – thebjorn
'r'「(?:\\」| [^「])*」''' –
不要忘記,您還需要處理前綴(unicode/raw strings。)例如,u「ª unicode字符串「,r」\我有3個字面反斜槓\\「,UR'unícode和no \ e \ s \ c \ a \ p \ e字符'。還有分隔符 - '/「/'''/」「」。即使您不能在原始字符串中轉義分隔符,仍然無法使用反斜槓結束原始字符串。大量的邊緣案件涉及你想做的事情。 – GVH