Regex для файла или URL-пути в Python [закрыто]

В Python это используется

matches_list = re.findall(r'/^((https?|ftp|file):\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w', line) 

для таких данных, как:

 https://projects.lukehaas.me/regexhub/
 C://path/folder_0/file
 c://path/folder_0/file
 www.google.com
 www.test.com/123/456

в разгар содержимого электронной почты. Основная идея состоит в том, чтобы извлечь их из содержимого.

например.

 (id5) id5@gmail.com 2019-07:27 22:04:38.635317100 -0700
 (id62) id11@gmail.com 2010/08/26 00010111101   111 0b00110
 (id52) id52@gmail.com ‘0acdadecf822eeff32aca5830e438cb54aa722e3’, and ‘8BADF00D’.
 (52422user) id662@gmail.com 2019-07-27_2313hr_19sec     165.91.15.131  https://projects.lukehaas.me/regexhub/   C://path/folder_0/file
  c://path/folder_0/file  next one is  www.google.com [] www.test.com/123/456
 (llok) idffv@gmail.com 2019-07.27 0x0f4’,  /home/mita/file1

 and these www.test and www.test. ignore me ftp://[user[:password]@]host[:port]/url-path

 # https://projects.lukehaas.me/regexhub/

Однако, это не так. Я не знаком с регулярным выражением. Как это можно исправить?

Как также определить файл и URL по отдельности?

def get_file_url_path(self, line):
    file_url_path = []

    # regex = r"(?i)([a-z]:\/\/[^\/]+\/\S*)|((?:https?:\/\/)?(?:www\.)?[a-z0-9_-]+[.][a-z0-9_-]+\S*)|((?:ftp:\/\/)\S*)"
    regex = r'(?:http|http|www|ftp|[a-zA-Z]{1}:)\S+'

    match_list = re.findall(regex, line, re.M)

    for match in match_list:
        file_url_path.append(match)


    return file_url_path

Вышеприведенный ответ наиболее близок к ответу, но он пропускает / home / mita / file1 '

Ответ, который очень близок. Это довольно полезная идея, и все же ответ может быть не таким прямым и простым.

-8
задан EJoshuaS 28 July 2019 в 23:08
поделиться

4 ответа

Если Вам нужен более простой regex для понимания, который возвратит целую строку как URL или Путь к файлу:

import re

list = [
    'https://projects.lukehaas.me/regexhub/', 
    'C://path/folder_0/file', 
    'c://path/folder_0/file', 
    'www.google.com', 
    'www.test.com/123/456'
]

for url in list:
    if re.findall(r'^(https|http|www)', url): # Checks from starting position of string(^), using pipe(|) character as a "OR" condition to check which strings starts with these pattern
        print('Found URL: ' + url)
    elif re.findall(r'([a-zA-Z]{1}:)', url): # Checks from starting position of string(^), uses bracket([]) which contains sets of character, in this case "a" to "z" and "A" to "Z" with using curly braces({}) which contains number of characters and then literal colon symbol(:) to check which strings starts with these pattern
        print('Found File Path: ' + url)

РЕДАКТИРОВАНИЕ: Попробуйте ниже примера согласно Вашему данному почтовому основному тексту:

email_body = " (id5) id5@gmail.com 2019-07:27 22:04:38.635317100 -0700 (id62) id11@gmail.com 2010/08/26 00010111101   111 0b00110 (id52) id52@gmail.com ‘0acdadecf822eeff32aca5830e438cb54aa722e3’, and ‘8BADF00D’. (52422user) id662@gmail.com 2019-07-27_2313hr_19sec     165.91.15.131  https://projects.lukehaas.me/regexhub/   C://path/folder_0/file  c://path/folder_0/file  next one is  www.google.com [] www.test.com/123/456 (llok) idffv@gmail.com 2019-07.27 0x0f4’,  /home/mita/file1 # https://projects.lukehaas.me/regexhub/"

files = re.findall(r'(?:[^https|ftp|http|www][a-zA-Z]{1}:)\S+', email_body)
urls = re.findall(r'(?:http|http|www|ftp)\S+', email_body)
1
ответ дан 5 September 2019 в 20:13
поделиться

Нет большого количества детали о том, какой более широкий диапазон шаблонов Вы хотите искать, но я предположил, что все, чему Вы хотите соответствовать, является этими пятью примерами , Вы дали. Принятие этого имеет место, и это - большое предположение, все, что необходимо искать, начинаются ли строки с одного из них [https://, http://, ftp://, file://, www., C://, C://].

я буду повреждать проблему на двух шагах. Сначала я скомпилирую шаблон, и затем я буду искать его. Я сделал это как ниже.

import re
Strings_To_Search = [ 'https://projects.lukehaas.me/regexhub/',
 'C://path/folder_0/file',
 'c://path/folder_0/file',
 'www.google.com',
 'www.test.com/123/456' ]
Pattern = re.compile('^((https|ftp|file)?([Cc])?:\/\/)?(www.)?')
for String in Strings_To_Search:
    print(re.search(Pattern,String))

Выполнение этого дало мне соответствия. Однако Ваша идея искать должна быть по большим шаблонам. Сообщите нам то, что точно Вы ищете в строках. Также обратите внимание, что необходимо иметь отрицательный контроль также (некоторые строки, которые не будут соответствовать).

вывод поиска как ниже

enter image description here

2
ответ дан 5 September 2019 в 20:13
поделиться

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

Тест

import re

regex = r"(?i)(?:\s|^)(?:([a-z]:\/\/[^\/]+\/\S*)|((?=.*https?:\/\/|.*www\.)(?:https?:\/\/)?(?:www\.)?[a-z]\w+\.\S{1,})|((?:\/[a-z]\w+){2,})|(ftp:\/\/\S*))"

test_str = """

 (id5) id5@gmail.com 2019-07:27 22:04:38.635317100 -0700
 (id5) id5@gmail.com 2019-07:27 22:04:38.635317100 -0700
 (id62) id11@gmail.com 2010/08/26 00010111101   111 0b00110
 (id52) id52@gmail.com ‘0acdadecf822eeff32aca5830e438cb54aa722e3’, and ‘8BADF00D’.
 (52422user) id662@gmail.com 2019-07-27_2313hr_19sec     165.91.15.131  https://projects.lukehaas.me/regexhub/   C://path/folder_0/file
  c://path/folder_0/file  next one is  www.google.com [] www.test.com/123/456
 (llok) idffv@gmail.com 2019-07.27 0x0f4’,  /home/mita/file1 /url /url/ 

 and these www.test and www.test. ignore me ftp://[user[:password]@]host[:port]/url-path

 # https://projects.lukehaas.me/regexhub/

"""
print(re.findall(regex, test_str, re.M))

Вывод

[('', 'https://projects.lukehaas.me/regexhub/', '', ''), ('C://path/folder_0/file', '', '', ''), ('c://path/folder_0/file', '', '', ''), ('', 'www.google.com', '', ''), ('', 'www.test.com/123/456', '', ''), ('', '', '/home/mita/file1', ''), ('', 'www.test', '', ''), ('', 'www.test.', '', ''), ('', '', '', 'ftp://[user[:password]@]host[:port]/url-path'), ('', 'https://projects.lukehaas.me/regexhub/', '', '')]
0
ответ дан 5 September 2019 в 20:13
поделиться

Рабочий пример: https://regex101.com/r/4g3U0a/3

(?P<url>((https|ftp|file):\/\/)|(\w*\.\w*\.\w*).*)|(?P<file>\w:\/\/.*)

Здесь Вы видите, как получить доступ к нему.

0
ответ дан 5 September 2019 в 20:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: