簡體   English   中英

使用re.match提取網址格式的部分

[英]Extract a section in url pattern using re.match

在的NodeJS,我使用正則表達式來提取下的子部分tenant在這個網址, http://myServer:8000/api/running/tenant/sk/services sk可以正確打印。

代碼是

var re = /(?:[\w\W]+)\/tenant\/([\w]+?)\/(?:[\w\W]*)/
var results = re.exec('http://myServer:8000/api/running/tenant/sk/services')
console.log(results[1])

我將代碼移至python,

import re
m = re.match(r"(?:\w\W+)tenant/(\w+)/(?:[\w\W]*)", "http://myServer:8000/api/running/tenant/sk/services")
m.group(1)

它拋出AttributeError: 'NoneType' object has no attribute 'group'

為什么它不匹配tenant后面的一個單詞?

findall /搜索應該可以幫助您

找到所有

>>> m = re.findall(r"(?:\w\W+)tenant/(\w+)/(?:[\w\W]*)", "http://myServer:8000/api/running/tenant/sk/services")
>>> m
['sk']

搜索

>>> m = re.search(r"(?:\w\W+)tenant/(\w+)/(?:[\w\W]*)", "http://myServer:8000/api/running/tenant/sk/services")
>>> m.group(1)
'sk'

匹配失敗的原因是因為它嘗試在字符串重新開始時進行匹配。

re.match(pattern,string,flags = 0)如果字符串開頭的零個或多個字符與正則表達式模式匹配,則返回相應的MatchObject實例。 如果字符串與模式不匹配,則返回None;否則返回false。 請注意,這與零長度匹配不同。

請注意,即使在MULTILINE模式下,re.match()也只會在字符串的開頭而不是每行的開頭進行匹配。

如果要在字符串中的任意位置找到匹配項,請改用search()(另請參見search()vs. match())。

match不具有group屬性。 嘗試search -

>>>m = re.search(r"(tenant)/(\w+)/(\w+)", "http://myServer:8000/api/running/tenant/sk/services")
>>>m.group(1)
>>>'tenant'
>>>m.group(2)
>>>'sk'
>>>m.group(3)
>>>'services'
>>>m.groups()
>>>('tenant', 'sk', 'services')

或嘗試使用re.split返回常規列表- (?<!\\\\)/(?!=\\\\)表示查找/不具有/之前或之后的-並用它分割文本-

>>>re.split(r"(?<!\\)/(?!=\\)", "http://myServer:8000/api/running/tenant/sk/services")
>>>['http:', '', 'myServer:8000', 'api', 'running', 'tenant', 'sk', 'services']

實際上,在這種情況下,您不需要正則表達式, str.split()就足夠了:

>>> url = 'http://myServer:8000/api/running/tenant/sk/services'
>>> l = url.split('/')
>>> l[l.index('tenant')+1]
'sk'
>>> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM