簡體   English   中英

正則表達式:最小的子字符串匹配

[英]Regex: Smallest possible substring match

我有如下網址字符串:

"https://facty.com/ailments/body/10-home-remedies-for-styes/pageid=2/slide_3/"

現在,我需要捕獲slide_3部分,更具體地講,數字3的開始位置受約束,即它應該是一個單一的數字(既不能在任何數字之前也不在其后),而不能以“ =”開頭。 因此, pageid=2不應該匹配,而slide_3應該匹配。

我用python regex嘗試過這個:

p = re.compile('/.*(?<!=)(?<!\d)\d(?!\d).*/')
s = "https://facty.com/ailments/body/10-home-remedies-for-styes/pageid=2/slide_3/"

for m in p.finditer(s):
    print(m.start(), m.group())

結果是

6 //facty.com/ailments/body/10-home-remedies-for-styes/pageid=2/slide_3/

我知道為什么得到這個,第一個和最后一個“ /”滿足正則表達式,但是子字符串“ / slide_3 /”也是如此。

如何確保獲得與正則表達式匹配的小子字符串。

為什么這樣不起作用:

'/[^/](?<!=)(?<!\d)\d(?!\d).*/'

非貪婪運算符.*? 似乎無法解決問題,因為它不能保證最短的比賽。

應該匹配的字符串:

"https://facty.com/ailments/body/10-home-remedies-for-styes/pageid=2/slide_3/" 
"https://facty.com/ailments/body/10-home-remedies-for-styes/pageid=2/sno3/"
"https://facty.com/ailments/body/10-home-remedies-for-styes/pageid=2/3/"

並且匹配項應分別為slide_3,sno3,3

不應該的字符串:

"https://facty.com/ailments/body/10-home-remedies-for-styes/pageid=2/slide/"
"https://facty.com/ailments/body/10-home-remedies-for-styes/pageid=2/slide_33/"
"https://facty.com/ailments/body/10-home-remedies-for-styes/pageid=2/33/"

如果我理解您的問題,那么您可以使用它來檢查字符串是否與您期望的模式匹配:

(?:^.*\/)([^\d]*\d)(?:\/?$)

\\1將包含:

slide_3
sno3
3

https://regex101.com/r/h0rNdC/4


這可能對獲取匹配項的索引很有用: Python Regex-如何獲取匹配項的位置和值

您可以匹配正斜杠,然后匹配0+乘除數字, /=或換行符以外的任何字符。

在捕獲組中捕獲一位數字並匹配尾隨的正斜杠。

要獲取比賽的開始和結束索引,例如,您可以使用re.search ,它將返回一個match對象

/[^\d/=\r\n]*(\d)/

regex演示 | Python演示

例如

import re

regex = r"/[^\d/=\r\n]*(\d)/"
strings = [
    "https://facty.com/ailments/body/10-home-remedies-for-styes/pageid=2/slide_3/",
    "https://facty.com/ailments/body/10-home-remedies-for-styes/pageid=2/sno3/",
    "https://facty.com/ailments/body/10-home-remedies-for-styes/pageid=2/3/",
    "https://facty.com/ailments/body/10-home-remedies-for-styes/pageid=2/slide/",
    "https://facty.com/ailments/body/10-home-remedies-for-styes/pageid=2/slide_33/",
    "https://facty.com/ailments/body/10-home-remedies-for-styes/pageid=2/33/"
]

for s in strings:
    matches = re.search(regex, s)
    if matches:
        print ("Group {groupNum} found at {start}-{end} value:{group}".format(groupNum = 1, start = matches.start(1), end = matches.end(1), group = matches.group(1)))

結果

Group 1 found at 74-75 value:3
Group 1 found at 71-72 value:3
Group 1 found at 68-69 value:3

暫無
暫無

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

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