2015-04-21 2 views
0

Я новичок в regex.Here мои данные.python regex получить текст среди двух тегов с новой строкой

<p>[tag]y,m,m,l 
1997,f,e,2.34g 
2000,m,c,2.38[/tag]</p> 

Я хочу получить это.

y,m,m,l 
1997,f,e,2.34g 
2000,m,c,2.38 

Настоящее мое регулярное выражение.

(<p>\[tag(.*)\])(.+)(\[\/tag\]<\/p>) 

Но это не работает из-за новой строки (\ п) .Если я использую re.DOTALL, это работает, но если мои данные имеет несколько записей, как

<p>[tag]y,m,m,l 
1997,f,e,2.34g 
2000,m,c,2.38[/tag]</p> 

<p>[tag]y,m,m,l 
1997,f,e,2.34g 
2000,m,c,2.38[/tag]</p> 

re.findall() возвращает только одно совпадение. Я кратко хочу этого. [данные1, данные2, данные3 ...]. Что я могу сделать?

+0

где он данные, поступающие из? –

+0

Вы можете использовать модификатор dotall вместе с не-жадным совпадением ... 're.findall (r '(? S)

\ [tag] (. *?) \ [/ Tag]

', текст)' – hwnd

+0

Но я бы, вероятно, использовал Beatuiful Soup, чтобы извлечь текст из тегов абзаца, а затем захватить содержимое между этими тегами. – hwnd

ответ

0

Вы можете использовать это регулярное выражение:

\[tag\]([\s\S]*?)\[\/tag\] 

Working demo

Match информация:

MATCH 1 
1. [8-44] `y,m,m,l 
1997,f,e,2.34g 
2000,m,c,2.38` 

Update: что

\[tag\] 
([\s\S]*?) --> the [\s\S]*? is used to match everything, since \S will capture 
       all non blanks and \s will capture blanks. This is just a trick, you can 
       also use [\D\d] or [\W\w]. Btw, the *? is just a ungreedy quantifier 
\[\/tag\] 

С другой стороны, если вы хотите, чтобы атрибуты тега вы можете использовать:

\[tag.*?\]([\s\S]*?)\[\/tag\] 
+0

Да, спасибо. Можете ли вы объяснить «\ s \ S» и, кроме того, если я хочу получить параметры тега, такие как [tag id = «5» a = «3»]. Например

[tag id = "5" a = " 5" ] у, м, м, л 1997 года, е, е, 2,34 г 2000, т, с, 2,38 [/ теги]

получить 'Y, M, m, l 1997, F, E , 2.34g 2000, m, c, 2.38' и id = 5 и a = 5 – amokaci

+0

@amokaci обновлено, посмотрите –

+0

Я задал много вопросов, но «[tag (. *?)] ([\ S \ S] *?) [\/Tag] ', и я могу получить такие параметры, как id и name. Например [tag id = "5" name = "name"], и у меня есть строка «id = 5 и name = name». Каков наилучший способ разделения этих параметров. – amokaci

0

Простой, как это:

\](.*?)\[ 

reobj = re.compile(r"\](.*?)\[", re.IGNORECASE | re.DOTALL | re.MULTILINE) 
result = reobj.findall(YOURSTRING) 

Выход:

y,m,m,l 
1997,f,e,2.34g 
2000,m,c,2.38 

DEMO


Regex Объяснение:

\] matches the character ] literally 
1st Capturing group (.*?) 
    .*? matches any character 
     Quantifier: *? Between zero and unlimited times, as few times as possible, expanding as needed [lazy] 
\[ matches the character [ literally 
s modifier: single line. Dot matches newline characters 
Смежные вопросы