[Последующие от моего старого question с лучшего описания и ссылки]Регулярное выражение для сравнения ничего между комбинацией цитат
Попытка любой символ (включая символ новой строки, символы табуляции, пробелов и т.д.) между двумя символы, включая эти символы.
Например:
foobar89\n\nfoo\tbar; '''blah blah blah'8&^"'''
должны соответствовать
''blah blah blah'8&^"'''
и
fjfdaslfdj; '''blah\n blah\n\t\t blah\n'8&^"'''
необходимость соответствовать
'''blah\n blah\n\t\t blah\n'8&^"'''
Мой Python код (взято и адаптировано из here), на который я тестирование регулярных выражений:
import collections
import re
Token = collections.namedtuple('Token', ['typ', 'value', 'line', 'column'])
def tokenize(code):
token_specification = [
('BOTH', r'([\'"]{3}).*?\2'), # for both triple-single quotes and triple-double quotes
('SINGLE', r"('''.*?''')"), # triple-single quotes
('DOUBLE', r'(""".*?""")'), # triple-double quotes
# regexes which match OK
('COM', r'#.*'),
('NEWLINE', r'\n'), # Line endings
('SKIP', r'[ \t]+'), # Skip over spaces and tabs
('MISMATCH',r'.'), # Any other character
]
test_regexes = ['COM', 'BOTH', 'SINGLE', 'DOUBLE']
tok_regex = '|'.join('(?P<%s>%s)' % pair for pair in token_specification)
line_num = 1
line_start = 0
for mo in re.finditer(tok_regex, code):
kind = mo.lastgroup
value = mo.group(kind)
if kind == 'NEWLINE':
line_start = mo.end()
line_num += 1
elif kind == 'SKIP':
pass
elif kind == 'MISMATCH':
pass
else:
if kind in test_regexes:
print(kind, value)
column = mo.start() - line_start
yield Token(kind, value, line_num, column)
f = r'C:\path_to_python_file_with_examples_to_match'
with open(f) as sfile:
content = sfile.read()
for t in tokenize(content):
pass #print(t)
где file_with_examples_to_match
является:
import csv, urllib
class Q():
"""
This class holds lhghdhdf hgh dhghd hdfh ghd fh.
"""
def __init__(self, l, lo, d, m):
self.l= l
self.lo= longitude
self.depth = d
self.m= m
def __str__(self):
# sdasda fad fhs ghf dfh
d= self.d
if d== -1:
d= 'unknown'
m= self.m
if m== -1:
d= 'unknown'
return (m, d, self.l, self.lo)
foobar89foobar; '''blah qsdkfjqsv,;sv
vqùlvnqùv
dqvnq
vq
v
blah blah'8&^"'''
fjfdaslfdj; '''blah blah
blah
'8&^"'''
С this answer, я стараюсь r"('''.*?''')|"r'(""".*?""")
соответствовать оба случая тройные одиночные кавычки и тройные двойные кавычки без успеха. То же самое при попытке r'([\'"]{3}).*?\2')
.
Я установил тег регулярного выражения online, где некоторые из регулярных выражений соответствуют, как они предполагалось, но когда в коде выше они терпят неудачу.
Я заинтересован в получении понимания в регулярных выражениях Python, поэтому я был бы признателен за решение (возможно, правильное регулярное выражение для выполнения нужного соответствия в моем коде) и краткое объяснение, чтобы я мог видеть мои недостатки.
Я думаю, что не понимаю, что вы ищете. Из-за жадного характера регулярных выражений python '. *' Должен захватывать что-либо между двумя апострофами, включая любые апострофы. В чем именно проблема? –
@JasonBray Проблема в том, что я пытаюсь сопоставить что-либо между тремя последовательными двойными кавычками или тремя последовательными одинарными кавычками. Когда я использую регулярные выражения 'r '(' ''. *? '' ')" ',' R' ("" ". *?" "") '',' R' ([\ '"] {3 }). *? \ 2 ') ', хотя онлайн-тестеры regex показывают, что эти регулярные выражения соответствуют друг другу, когда они используются в коде в моем описании, они не совпадают. Ищете для понимания, почему. –