Получение частей URL (Regex)

Ответ на верхний голос не учитывает случаи, когда максимальная прибыль отрицательна и должна быть изменена, чтобы допускать такие случаи. Это можно сделать, ограничив диапазон цикла до (len (a) - 1) и изменив способ получения прибыли путем изменения индекса на единицу.

def singSellProfit(a):
profit = -max(a)
low = a[0]

for i in range(len(a) - 1):
    low = min(low, a[i])
    profit = max(profit, a[i + 1] - low)
return profit

Сравните эту версию функции с предыдущим для массива:

s = [19,11,10,8,5,2]

singSellProfit(s)
-1

DynamicProgrammingSingleSellProfit(s)
0
127
задан Willi Mentzel 13 January 2019 в 11:34
поделиться

11 ответов

А единственный regex для парсинга и разрыв полный URL включая параметры запроса и привязки, например,

https://www.google.com/dir/1/2/search.html? arg=0-a& arg1=1-b& положения arg3-c#hash

^((http[s]?|ftp):\/)?\/?([^:\/\s]+)((\/\w+)*\/)([\w\-\.]+[^#?\s]+)(.*)?(#[\w\-]+)?$

RexEx:

URL: RegExp [' $ &';],

protocol:RegExp. 2$,

host:RegExp. 3$,

path:RegExp. 4$,

file:RegExp.$6,

query:RegExp. 7$,

hash:RegExp. 8$

Вы могли затем далее проанализировать хост (''. разграниченный) довольно легко.

то, Что я сделал бы, использовать что-то вроде этого:

/*
    ^(.*:)//([A-Za-z0-9\-\.]+)(:[0-9]+)?(.*)$
*/
proto $1
host $2
port $3
the-rest $4

дальнейший синтаксический анализ 'остальные', чтобы быть максимально конкретным. Выполнение его в одном regex является, ну, в общем, немного сумасшедшим.

138
ответ дан 24 November 2019 в 00:42
поделиться

Java предлагает класс URL, который сделает это. Объекты URL Запроса.

На ноте стороны, предложениях PHP parse_url () .

1
ответ дан 24 November 2019 в 00:42
поделиться

Попробуйте следующее:

^((ht|f)tp(s?)\:\/\/|~/|/)?([\w]+:\w+@)?([a-zA-Z]{1}([\w\-]+\.)+([\w]{2,5}))(:[\d]{1,5})?((/?\w+/)+|/?)(\w+\.[\w]{3,4})?((\?\w+=\w+)?(&\w+=\w+)*)?

Это поддерживает HTTP / FTP, субдомены, папки, файлы и т.д.

, я нашел его от быстрого поиска Google:

http://geekswithblogs.net/casualjim/archive/2005/12/01/61722.aspx

5
ответ дан 24 November 2019 в 00:42
поделиться

Я знаю, что Вы требуете агностика языка на этом, но можно сказать нам, что Вы используете именно так, мы знаем, какие regex возможности Вы имеете?

, Если у Вас есть возможности неполучения соответствий, можно изменить выражение hometoast так, чтобы подвыражения, что Вы не интересуетесь получением, были настроены как это:

(?:SOMESTUFF)

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

Так же, как маленькое, маленькое примечание, выражение hometoast не должно помещать скобки вокруг' для 'https', так как у него только есть один символ там. Кванторы определяют количество одного символа (или класс символов или подвыражение) непосредственно предыдущий их. Так:

https?

соответствовал бы 'http' или 'https' очень хорошо.

0
ответ дан 24 November 2019 в 00:42
поделиться

Используя http://www.fileformat.info/tool/regex.htm regex hometoast работает отлично.

, Но вот соглашение, я хочу использовать различные regex шаблоны в различных ситуациях в моей программе.

, Например, у меня есть этот URL, и у меня есть перечисление, которое перечисляет все поддерживаемые URL в моей программе. Каждый объект в перечислении имеет метод getRegexPattern, который возвращает regex шаблон, который будет затем использоваться для сравнения URL. Если конкретный regex шаблон возвращает true, то я знаю, что этот URL поддерживается моей программой. Так, каждое перечисление имеет свой собственный regex в зависимости от того, где это должно посмотреть в URL.

предложение Hometoast является большим, но в моем случае, я думаю, что это не помогло бы (если я не копирую, вставляют тот же regex во всех перечислениях).

Именно поэтому я хотел, чтобы ответ дал regex для каждой ситуации отдельно. Хотя +1 для hometoast. ;)

0
ответ дан 24 November 2019 в 00:42
поделиться
/^((?P<scheme>https?|ftp):\/)?\/?((?P<username>.*?)(:(?P<password>.*?)|)@)?(?P<hostname>[^:\/\s]+)(?P<port>:([^\/]*))?(?P<path>(\/\w+)*\/)(?P<filename>[-\w.]+[^#?\s]*)?(?P<query>\?([^#]*))?(?P<fragment>#(.*))?$/

Из моего ответа на подобный вопрос . Работы лучше, чем некоторые из других упомянули, потому что у них были некоторые ошибки (такие как не поддержка имени пользователя/пароля, не поддерживая односимвольные имена файлов, повреждаемые идентификаторы фрагмента).

4
ответ дан 24 November 2019 в 00:42
поделиться

субдомен и домен являются трудными, потому что субдомен может иметь несколько частей, как может высокоуровневый домен, http://sub1.sub2.domain.co.uk/

 the path without the file : http://[^/]+/((?:[^/]+/)*(?:[^/]+$)?)  
 the file : http://[^/]+/(?:[^/]+/)*((?:[^/.]+\.)+[^/.]+)$  
 the path with the file : http://[^/]+/(.*)  
 the URL without the path : (http://[^/]+/)  

(Скидка с цены не является очень дружественной по отношению к regexes)

5
ответ дан 24 November 2019 в 00:42
поделиться

Я нашел, что самый высокий проголосовавший ответ (ответ hometoast) не работает отлично на меня. Две проблемы:

  1. Это не может обработать номер порта.
  2. часть хеша повреждается.

следующее является измененной версией:

^((http[s]?|ftp):\/)?\/?([^:\/\s]+)(:([^\/]*))?((\/\w+)*\/)([\w\-\.]+[^#?\s]+)(\?([^#]*))?(#(.*))?$

Положение частей следующие:

int SCHEMA = 2, DOMAIN = 3, PORT = 5, PATH = 6, FILE = 8, QUERYSTRING = 9, HASH = 12

Редактирование, отправленное скоро пользователем:

function getFileName(path) {
    return path.match(/^((http[s]?|ftp):\/)?\/?([^:\/\s]+)(:([^\/]*))?((\/[\w\/-]+)*\/)([\w\-\.]+[^#?\s]+)(\?([^#]*))?(#(.*))?$/i)[8];
}
31
ответ дан 24 November 2019 в 00:42
поделиться

regexp для получения пути URL без файла.

url = ' http: // domain / dir1 / dir2 / somefile ' url.scan (/ ^ (http: // [^ /] +) ((?: / [^ /] +) + (? = /))? /? (?: [^ /] +)? $ / i) .to_s

Это может быть полезно для добавления относительного пути к этому URL.

0
ответ дан 24 November 2019 в 00:42
поделиться

You can get all the http/https, host, port, path as well as query by using Uri object in .NET. just the difficult task is to break the host into sub domain, domain name and TLD.

There is no standard to do so and can't be simply use string parsing or RegEx to produce the correct result. At first, I am using RegEx function but not all URL can be parse the subdomain correctly. The practice way is to use a list of TLDs. After a TLD for a URL is defined the left part is domain and the remaining is sub domain.

However the list need to maintain it since new TLDs is possible. The current moment I know is publicsuffix.org maintain the latest list and you can use domainname-parser tools from google code to parse the public suffix list and get the sub domain, domain and TLD easily by using DomainName object: domainName.SubDomain, domainName.Domain and domainName.TLD.

This answers also helpfull: Get the subdomain from a URL

CaLLMeLaNN

2
ответ дан 24 November 2019 в 00:42
поделиться

Я бы рекомендовал не использовать регулярное выражение. Вызов API вроде WinHttpCrackUrl () менее подвержен ошибкам.

http://msdn.microsoft.com/en-us/library/aa384092%28VS.85%29.aspx

1
ответ дан 24 November 2019 в 00:42
поделиться
Другие вопросы по тегам:

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