Я придумал решение регулярных выражений для вашей проблемы.Я пытался сохранить шаблон регулярного выражения как «общий», как мог, потому что я не знаю, будут ли всегда в вашем тексте символы новой строки и пробелы, что означает, что шаблон выделяет много пробелов, которые затем удаляются.
#Import the module for regular expressions
import re
#Text to search. I CORRECTED IT A BIT AS YOUR EXAMPLE SAID second d AND second_c WAS FOLLOWED BY TWO COMMAS. I am assuming those were typos.
text = '''ENGINE = CollapsingMergeTree (
first_param
,(
second_a
,second_b, second_c
,second_d), third, fourth)'''
#Regex search pattern. re.S means . which represents ANY character, includes \n (newlines)
pattern = re.compile('ENGINE = CollapsingMergeTree \((.*?),\((.*?)\),(.*?), (.*?)\)', re.S) #ENGINE = CollapsingMergeTree \((.*?),\((.*?)\), (.*?), (.*?)\)
#Apply the pattern to the text and save the results in variable 'result'. result[0] would return whole text.
#The items you want are sub-expressions which are enclosed in parentheses () and can be accessed by using result[1] and above
result = re.match(pattern, text)
#result[1] will get everything after theparenteses after CollapsingMergeTree until it reaches a , (comma), but with whitespace and newlines. re.sub is used to replace all whitespace, including newlines, with nothing
first = re.sub('\s', '', result[1])
#result[2] will get second a-d, but with whitespace and newlines. re.sub is used to replace all whitespace, including newlines, with nothing
second = re.sub('\s', '', result[2])
third = re.sub('\s', '', result[3])
fourth = re.sub('\s', '', result[4])
print(first)
print(second)
print(third)
print(fourth)
ВЫХОД:
first_param
second_a,second_b,second_c,second_d
third
fourth
Объяснение регулярного выражения: \ = Выход из управляющего символа, который является символьным регулярным выражением, которое может интерпретироваться как нечто особенное.Подробнее здесь .
\ (= убрать скобки
() = пометить выражение в скобках как подгруппу. См. Результат [1] и т. Д.
. = Соответствует любому символу (включая символ новой строки из-за re.S)
* = Соответствует 0 или более вхождений предыдущего выражения.
? = Соответствует 0 или 1вхождение предыдущего выражения.
ПРИМЕЧАНИЕ: *? комбинированный называется несжатым повторением, то есть предыдущее выражение сопоставляется только один раз, а не снова и снова.
Я не эксперт, ноНадеюсь, я правильно объяснил.
Надеюсь, это поможет.