2016-08-13 2 views
1

Используя Python 2.7, вы хотите использовать регулярное выражение, чтобы найти часть заданной строки Hello. Правило: Hello Возможно, в шаблоне начинается {(1N), {(2N) (до 10N) или их комбинация {(1N,2N,3N,4N) и заканчивается на }.проблема совпадения регулярных выражений в Python 2.7

Помимо соответствие Hello части, я также хотел бы знать, если 1N матча, или 2N матча или 10N матча, или как 1N или 2N матч.

Любые решения оцениваются.

Some content {(1N,2N,3N,4N) Hello } Some content 

    Some content {(1N) Python } Some content 

    Some content {(2N) Regex } Some content 

В первом примере, я хочу знать 1N, 2N, 3N, 4N матчи, и соответствует строка Hello;

Во втором примере я хочу знать 1N совпадений, и строка соответствует Python; В третьем примере я хочу знать совпадения 2N, а строка с последовательностью - Regex;

С уважением, Лин

+2

Можете ли вы показать свою собственную попытку? – pistache

+0

@pistache, я пытался сопоставить '{(1N (. *?)}' Через '{(10N (. *?)}', Соответствует 10 раз для данной строки, что звучит немного глупо, и мне также нужно удалите некоторые префикс ненужных совпадений, поэтому я пришел сюда, чтобы спросить. У вас есть несколько более эффективных решений? :) –

+1

Вы пытались играть в любом из онлайн-тестировщиков регулярных выражений Python? Поскольку у вас так много переменных, чтобы сделать несколько проходов - сначала напишите выражение в соответствии с '' '' \ {\ (. *? \) Hello \} '' 'частью. – wwii

ответ

1
In [82]: string = "Some content {(1N,2N,3N,4N) Hello } Some content" 
In [83]: result = re.findall(r"(\((?:(?:10|[1-9])N(?:,|\)))+)\s*(\w+)", string) 
In [84]: nums = re.findall(r"10N|[1-9]N", result[0][0]) 
In [85]: nums 
Out[85]: ['1N', '2N', '3N', '4N'] 
In [86]: matchString = result[0][1] 
In [87]: matchString 
Out[87]: 'Hello' 

Для новой строки:

In [1]: import re 

In [2]: string = "{(1N,2N,3N,4N) Hello } Some Content {(5N) World }" 

In [3]: re.findall(r"(\((?:(?:10|[1-9])N(?:,|\)))+)\s*(\w+)", string) 
Out[3]: [('(1N,2N,3N,4N)', 'Hello'), ('(5N)', 'World')] 

In [4]: result = re.findall(r"(\((?:(?:10|[1-9])N(?:,|\)))+)\s*(\w+)", string) 

In [5]: nums = [re.findall(r"10N|[1-9]N", item[0]) for item in result] 

In [6]: nums 
Out[6]: [['1N', '2N', '3N', '4N'], ['5N']] 

In [7]: matchString = [s[1] for s in result] 

In [8]: matchString 
Out[8]: ['Hello', 'World'] 
+0

Умное решение! Голосовать! Спасибо, jcxu! Не могли бы вы объяснить немного больше, когда вы используете '?:' 3 раза? –

+0

Привет, jcxu, попробовал ваше решение и встретился с одной новой проблемой, для строки ввода, подобной этой '{(1N, 2N, 3N, 4N) Hello} Some Content {(5N) World}', я хочу получить согласованную информацию как, 'Hello' с' 1N', '2N',' 3N', '4N' и' World' с '5N', т. Е. Я хочу совместить несколько раз не-жадным способом, после того как мы найдем соответствие, мы всегда будет соответствовать другому, есть ли решение? –

+0

Ваш вывод решения моей входной строки выше - это только 'Hello' с' 1N', '2N',' 3N', '4N'. –

2

Регулярные выражения не могут реально рассчитывать (почему вы говорите, что вы пытались писать в 10 раз по той же схеме), но вместо этого вы можете соответствовать последовательности, а затем разделить на количество:

In [100]: match = re.compile(r"\{\s?\(\s?((\d+N,?)+)\)\s?(.*)\s?\}").search("Some content { (1N,2N,3N,4N) Hello } Some content") 

In [101]: items, _, text = match.groups() 

In [102]: splitted = items.split(',') 

In [103]: print(splitted) 
['1N', '2N', '3N', '4N'] 

In [104]: print(text) 
Hello 

ПРИМЕЧАНИЕ: Все \s? могут обрабатывать дополнительные заготовки, удалять их, если вы знаете, что вам не нужно в определенных местах.

+1

Спасибо, спасибо за фисташ, я могу неправильно интерпретировать вопрос. 'Hello' часть может быть любой string, я просто использую 'Hello' в качестве примера, я обновлю вопрос. Если у вас есть хорошие идеи, это будет здорово. –

+0

Прохладный, спасибо фисташ. Что означает '_' в вашей строке' [101] '? Благодарю. –

+1

'_' - это имя переменной, которую я присваиваю второй группе захвата. Вторая группа захвата временно удерживает каждый элемент, такой как «1N» или «10N», и когда он считывается после сопоставления, он возвращает только последнее совпадение для этого подшаблона. Поскольку мне действительно не нужно это значение (но нужно, чтобы группа была в шаблоне), я сохраняю ее под именем, которое, я уверен, никогда не использовал. Было бы лучше сделать его не захватывающей группой (измените '(\ d + N,?)' На '(?: \ D + N,?)', А затем удалите '_,' из кода Python , но я не был уверен, что вы знали о группах, не участвующих в захвате. – pistache

Смежные вопросы