Форум сайта python.su
0
Всем привет!
Не первый раз работаю с регулярными выражениями (правдо на автоите дело было).
Есть строки определенного вида:
titleA var1 r.text(a, b, <NAME>) var11Мне нужно получить значение <ip_addr>, если в предыдуще строке (где titleA)
titleB var2 r.text(a, b, <ip_addr1>) var22
titleA var3 r.text(a, b, <name>) var33
titleB var4 r.text(a, b, <ip_addr2>) var44
import re string = 'titleA var1 r.text(a, b, <NAME>) var11\ntitleB var2 r.text(a, b, <ip_addr1>) var22\ntitleA var3 r.text(a, b, <name>) var33\ntitleB var4 r.text(a, b, <ip_addr2>) var44' t1 = re.findall('titleA[^(?:r.text)]*r\.text\([^\)]*[^(?:NAME)]*\)[^(?:r.text)]*r\.text\([^\)]*([1-9][0-9]{0,2}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})\)',string,re.DOTALL) print t1
import re string = 'titleA var1 r.text(a, b, <NAME>) var11\ntitleB var2 r.text(a, b, <ip_addr1>) var22\ntitleA var3 r.text(a, b, <name>) var33\ntitleB var4 r.text(a, b, <ip_addr2>) var44' t1 = re.findall('titleA[^(?:r\.text)]*r\.text(\([^\)]*\))',string,re.DOTALL) print t1
'(a, b, <NAME>)'
'(a, b, <name>)'
Отредактировано Dezex (Дек. 8, 2015 08:47:36)
Офлайн
568
Да зачем так усложнять, читайте свой лог построчно.
Офлайн
857
>>> import re >>> >>> text = """ ... titleA var1 r.text(a, b, <NAME>) var11 ... titleB var2 r.text(a, b, <ip_addr1>) var22 ... titleA var3 r.text(a, b, <name>) var33 ... titleB var4 r.text(a, b, <ip_addr2>) var44 ... titleA var1 r.text(a, b, <NAME>) var11 ... titleB var2 r.text(a, b, <ip_addr3>) var22 ... titleA var3 r.text(a, b, <name>) var33 ... titleB var4 r.text(a, b, <ip_addr4>) var44 ... """ >>> >>> it = iter(re.findall(r'<([^>]*)>', text)) >>> out = [j for i, j in zip(it, it) if i != 'NAME'] >>> out ['ip_addr2', 'ip_addr4'] >>>
Отредактировано py.user.next (Дек. 8, 2015 12:27:55)
Офлайн
0
py.user.nextСпасибо!
import re # text = """ titleA var1 r.text(a1, b1, NAME).attr(var11) titleB var2 r.text(a2, b2, ip_addr1).attr(var22) <<anything, besides titleA and titleB>> titleA var3 r.text(a3, b3, name).attr(var33) titleB var4 r.text(a4, b4, ip_addr2).attr(var44) <<anything, besides titleA and titleB>> titleA var5 r.text(a5, b5, NAME).attr(var55) titleB var6 r.text(a6, b6, ip_addr3).attr(var66) <<anything, besides titleA and titleB>> titleA var7 r.text(a7, b7, name).attr(var77) titleB var8 r.text(a8, b8, ip_addr4).attr(var88) <<anything, besides titleA and titleB>> """ # it = iter(re.findall('title[AB].*r\.text\([^\)]*\s(\w+)\)',text)) print it # out = [j for i, j in zip(it, it) if i != 'NAME'] out
x= ['NAME', 'ip_addr1', 'name', 'ip_addr2', 'NAME', 'ip_addr3', 'name', 'ip_addr4']
'r.text(a1, b1, NAME).attr(var11)'если использовать код:
import re # text = "titleA var1 r.text(a1, b1, NAME).attr(var11)" # t1 = re.findall('titleA[^(?:r\.text)]*(.*)',text) # print t1 ['r1 r.text(a1, b1, NAME).attr(var11)']
[^(?:r\.text)]*
Отредактировано Dezex (Дек. 8, 2015 11:48:39)
Офлайн
857
Dezex
Правда у меня немножко посложнее строки.
>>> import re >>> >>> text = """ ... titleA var1 r.text(a1, b1, NAME).attr(var11) ... titleB var2 r.text(a2, b2, ip_addr1).attr(var22) ... <<anything, besides titleA and titleB>> ... titleA var3 r.text(a3, b3, name).attr(var33) ... titleB var4 r.text(a4, b4, ip_addr2).attr(var44) ... <<anything, besides titleA and titleB>> ... titleA var5 r.text(a5, b5, NAME).attr(var55) ... titleB var6 r.text(a6, b6, ip_addr3).attr(var66) ... <<anything, besides titleA and titleB>> ... titleA var7 r.text(a7, b7, name).attr(var77) ... titleB var8 r.text(a8, b8, ip_addr4).attr(var88) ... <<anything, besides titleA and titleB>> ... """ >>> >>> it = iter(re.findall(r'^title[AB].* (.+)\)\.', text, re.M)) >>> out = [j for i, j in zip(it, it) if i != 'NAME'] >>> out ['ip_addr2', 'ip_addr4'] >>>
DezexКонтейнер превращается в итератор. Отличие в том, что в итераторе исчерпываются элементы.
Что же делает iter(x) с x - читал не понял
Dezexzip() берёт по элементу из каждого аргумента и возвращает пару. И это повторяется, пока есть элементы в обоих аргументах.
Что произходит при обращении к iter() через zip():
>>> it = iter([1, 2, 3, 4]) >>> it <list_iterator object at 0xb738deac> >>> next(it), next(it) (1, 2) >>> next(it), next(it) (3, 4) >>> next(it), next(it) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration >>>
Отредактировано py.user.next (Дек. 8, 2015 12:35:58)
Офлайн
0
Ага, теперь это понятно. Практически моя задача решена набор, строк на самом деле еще сложнее
, но разобрался с вашей помощью.
И я так понял эта конструкция неправильная (не используется):
….. чтобы
[^(?:r\.text)]*
Офлайн