Регулярное выражение для соответствия URL в файле журнала выдает ошибку продолжения строки - что мне нужно экранировать? - PullRequest
2 голосов
/ 06 июня 2019

Я пытаюсь проанализировать журнал обратного доступа и получить регулярное выражение, соответствующее базовому URL, поместить его в переменную и затем напечатать переменную. Там написано, что печать - это недопустимый синтаксис. Я играл со всеми видами выхода из регулярного выражения, вызывая различные другие ошибки. Чего мне не хватает?

import re, sys, glob, os

with open('log.txt') as f:
    for line in f:
       match = re.search("http|https):\/\/(.*?)./"
        print("match")

Ответы [ 2 ]

0 голосов
/ 06 июня 2019

У вас есть непревзойденный ) в шаблоне http|https):\/\/(.*?)./, а метод re.search не завершен.

Использование

match = re.search(r"https?://([^/]*)", line)

Детали шаблона

  • http - http строка
  • s? - необязательный s
  • :// - подстрока ://
  • ([^/]*) - Группа захвата 1: любые 0 или более символов, кроме /

Если вы планируете печатать совпавшее значение вместо всей строки, получите право .group():

import re, sys, glob, os

with open('log.txt') as f:
    for line in f:
        match = re.search(r"https?://([^/]*)", line)
        if match:                 # Always check if there is a match before accessing groups
            print(match.group(1)) # Only print capture group value, group() will print the whole match
0 голосов
/ 06 июня 2019

Исходя из вашего исходного выражения, я предполагаю, что здесь мы хотим найти несколько URL с косой чертой в конце, для которых мы начнем с этого простого выражения:

https?:\/\/(.+?)\/

Демо

если конечная косая черта может быть нежелательной, мы упростим ее до:

https?:\/\/[^\s]+

Демо

или мыможем продолжать добавлять / удалять наши границы, если нам так нравится.

RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

Test

# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility

import re

regex = r"https?:\/\/[^\s]+"

test_str = ("https://somedomain/\n"
    "https://somedomain")

matches = re.finditer(regex, test_str, re.MULTILINE)

for matchNum, match in enumerate(matches, start=1):

    print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))

    for groupNum in range(0, len(match.groups())):
        groupNum = groupNum + 1

        print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum)))

# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...