How to combine string | REGEX

Question:

import re

def tst():
  text = '''
  <script>
  '''
  if proxi := re.findall(r"(?:<tds[^>]*?><fontsclass=spy14>(.*?)<script.*?"+(.*?))</script)", text):
    for proxy, port in proxi:
      yield f"{proxy}:{''.join(port)}"
    
    if dtt := re.findall(r"<td colspan=1><font class=spy1><font class=spy14>(.*?)</font> (d+[:]d+) <font class=spy5>([(]d+ w+ w+[)])", text):
      for date, time, taken in dtt:
        yield f"{date} {' '.join([time, taken])}"
   
    return None
  return None

for proxy in tst():
  print(proxy)

output that i get

51.155.10.0:8000
178.128.96.80:7497
98.162.96.41:4145
27-oct-2022 11:05 (49 mins ago)
27-oct-2022 11:04 (50 mins ago)
27-oct-2022 11:03 (51 mins ago)

so i use this regex below to capture group from output

(w+[.]w+[.]w+[.]w+[:]w+)|(w+.*)

i want the result like this, how to combine it from output?

157.245.247.84:7497 - 27-oct-2022 11:05 (49 mins ago)
184.190.137.213:8111 - 27-oct-2022 11:04 (50 mins ago)
202.149.89.67:7999 - 27-oct-2022 11:03 (51 mins ago)
Asked By: xnoob

||

Answers:

This approach reads all lines into a list, then iterates the IP lines and date lines in tandem to generate the output.

text = '''157.245.247.84:7497
184.190.137.213:8111
202.149.89.67:7999
27-oct-2022 11:05 (49 mins ago)
27-oct-2022 11:04 (50 mins ago)
27-oct-2022 11:03 (51 mins ago)'''
lines = text.split('n')
output = []
for i in range(0, len(lines) / 2):
    val = lines[i] + ' - ' + lines[i + len(lines)/2]
    output.append(val)

print('n'.join(output))

This prints:

157.245.247.84:7497 - 27-oct-2022 11:05 (49 mins ago)
184.190.137.213:8111 - 27-oct-2022 11:04 (50 mins ago)
202.149.89.67:7999 - 27-oct-2022 11:03 (51 mins ago)

Note that this answer assumes each IP line would always have exactly one matching date line. It also assumes that the lines are ordered, and that all IP lines come before the date lines.

Answered By: Tim Biegeleisen

Providing the text is guaranteed to contain N lines of IP addresses followed by N lines of "timestamps" then you could do this:

text = '''157.245.247.84:7497
184.190.137.213:8111
202.149.89.67:7999
27-oct-2022 11:05 (49 mins ago)
27-oct-2022 11:04 (50 mins ago)
27-oct-2022 11:03 (51 mins ago)'''

lines = text.splitlines()

for ip, t in zip(lines, lines[len(lines)//2:]):
    print(f'{ip} - {t}')

Output:

157.245.247.84:7497 - 27-oct-2022 11:05 (49 mins ago)
184.190.137.213:8111 - 27-oct-2022 11:04 (50 mins ago)
202.149.89.67:7999 - 27-oct-2022 11:03 (51 mins ago)
Answered By: OldBill

using regex

import re

text = '''
157.245.247.84:7497
184.190.137.213:8111
202.149.89.67:7999
27-oct-2022 11:05 (49 mins ago)
27-oct-2022 11:04 (50 mins ago)
27-oct-2022 11:03 (51 mins ago)
'''
ip_regex = r"(?:d{1,3}.){3}d{1,3}:d{4}"
time_regex = r'd{2}-w+-d{4}sd{2}:d{2}s(.+)'

ip_list = re.findall(ip_regex, text)
time_list = re.findall(time_regex, text)

for i in range(len(ip_list)):
    print(f'{ip_list[i]} - {time_list[i]}')


>>> 157.245.247.84:7497 - 27-oct-2022 11:05 (49 mins ago)
>>> 184.190.137.213:8111 - 27-oct-2022 11:04 (50 mins ago)
>>> 202.149.89.67:7999 - 27-oct-2022 11:03 (51 mins ago)
Answered By: Ramesh

Assuming that the code at the top of your (edited) question has regular expressions that work perfectly, and they run the same number of matches, you could use zip:

import re

def tst():
    text = '''
    <script>
    '''
    proxi = re.findall(r"(?:<tds[^>]*?><fontsclass=spy14>(.*?)<script.*?"+(.*?))</script)", text)
    dtt = re.findall(r"<td colspan=1><font class=spy1><font class=spy14>(.*?)</font> (d+[:]d+) <font class=spy5>([(]d+ w+ w+[)])", text)
    if proxi and dtt:
        for (proxy, port), (date, time, taken) in zip(proxi, dtt):
            yield f"{proxy}:{''.join(port)} {date} {' '.join([time, taken])}"
   
for proxy in tst():
    print(proxy)
Answered By: trincot
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.