Вот другой способ, который использует tokenize.generate_tokens для идентификации строк Python. Модуль tokenize использует regex; поэтому, используя 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 возвращает кортежи. Класс Token позволяет вам получить доступ к информации в кортеже.
- В частности, каждый токен имеет имя, например «STRING», «NEWLINE», «INDENT» или «OP». Вы можете использовать это, чтобы идентифицировать строки Python.
Edit: Мне нравится использовать класс маркеров, так что я не должен писать token.tok_name[num]
во многих местах.Тем не менее, для приведенного выше кода, может быть яснее и проще забыть о классе маркеров и просто написать основную идею в явном виде:
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 string.) Например, u "ª unicode string ", r" \ У меня есть 3 буквальной обратной косой черты \\ ", UR'unícode и no \ e \ s \ c \ a \ p \ e characters. Также разделители - '/'/'' '/ "" ". И даже если вы не можете избежать разделителей в необработанной строке, вы все равно не можете покончить с необработанной строкой с обратным слэшем. Много крайних случаев, связанных с тем, что вы хотите. – GVH