2016-07-28 5 views
2

Я изо всех сил стараюсь многострочное регулярное выражение с несколькими совпадениями.Regex многострочный синтаксис help (python)

У меня есть данные, разделенные символами новой строки/строк, как показано ниже. Мой шаблон соответствует каждой из этих строк, если я тестирую его отдельно. Как я могу сопоставить все вхождения (в частности, цифры?

Я читал, что я мог/должен был использовать DOTALL как-то (возможно, с MULTILINE). Это похоже на любой символ (новые строки также), но не уверен в какой-либо возможной стороне Эффекты не хотят, чтобы это соответствовало целому числу или чему-то и дало мне неправильные данные в конце. Любая информация на этом была бы замечательной.

Что мне действительно нужно, это помощь в создании этого примера кода Мне нужно только получить цифры из данных.

Я использовал re.fullmatch, когда мне нужно было только одно конкретное совпадение в предыдущем случае и не совсем уверен, какую функцию я должен теперь используйте (finditer, findall, search и т. д.).

Спасибо за все и вся помощь :)

data = """http://store.steampowered.com/app/254060/ 
http://www.store.steampowered.com/app/254061/ 
https://www.store.steampowered.com/app/254062 
store.steampowered.com/app/254063 
254064""" 

regPattern = '^\s*(?:https?:\/\/)?(?:www\.)?(?:store\.steampowered\.com\/app\/)?([0-9]+)\/?\s*$' 

evaluateData = re.search(regPattern, data, re.DOTALL | re.MULTILINE) 
if evaluateString2 is not None: 
    print('do stuff') 
else: 
    print('found no match') 

ответ

1

re.search остановка при первом появлении

Вы должны использовать этот Intead

re.findall(regPattern, data, re.MULTILINE) ['254060', '254061', '254062', '254063', '254064']

Примечание: Поиск не работает для меня (питон 2.7.9). Он просто возвращает первую строку данных

+1

Странно, я был уверен, что я пробовал это, но получил некоторую неясную ошибку. Спасибо :) – raecer

1

/ не имеет особого значения, так что вы не должны избежать этого (и в не сырые строки вам придется бежать каждый \)

попробовать это

regPattern = r'^\s*(?:https?://)?(?:www\.)?(?:store\.steampowered\.com/app/)?([0-9]+)/?\s*$' 
+0

Спасибо, я изменю свой шаблон :) – raecer

3
import re 
p = re.compile(ur'^\s*(?:https?:\/\/)?(?:www\.)?(?:store\.steampowered\.com\/app\/)?([0-9]+)\/?\s*$', re.MULTILINE) 
test_str = u"http://store.steampowered.com/app/254060/\nhttp://www.store.steampowered.com/app/254061/\nhttps://www.store.steampowered.com/app/254062\nstore.steampowered.com/app/254063\n254064" 

re.findall(p, test_str) 

https://regex101.com/r/rC9rI0/1

это дает [u'254060', u'254061', u'254062', u'254063', u'254064'].

Вы пытаетесь вернуть эти конкретные целые числа?

+0

Да, я просто пытался вернуть эти целые числа. Я могу перестроить URL позже, если захочу. – raecer

+1

Для справки: я просто подключил ваше регулярное выражение и данные в regex101.com, затем добавил модификаторы 'g' и' m', затем я нажал сгенерировать код и скопировать в python часть. Это очень полезный инструмент для начинающих программистов регулярных выражений. –

+1

О, человек. Я фактически использовал этот сайт для создания шаблона регулярных выражений, и я искал модификаторы, подобные тем, но не нашел их ...> _ <Хорошая функция для автогенерации кода. Определенно закладок, спасибо :) – raecer