在正则表达式模式python中使用动态int变量

问题描述 投票:0回答:2

我在学习python的初期,很抱歉,如果已经问过这个问题。我在这里写这些是没有帮助的,我的要求是读取文件并打印其中的所有URL。在for循环中,我使用的regex模式为[^https://][\w\W]*,它工作正常。但是我想知道我是否可以动态传递https://之后的行长,并获得带有出现次数而不是*

的输出?

我尝试过[^https://][\w\W]{var}},其中var=len(line)-len(https://)

这些是我尝试过的其他模式

pattern = '[^https://][\w\W]{'+str(int(var))+'}'

pattern = r'[^https://][\w\W]{{}}'.format(var)

pattern = r'[^https://][\w\W]{%s}'%var
python regex variables int
2个回答
0
投票

如果您知道url始终以https://开头,那么它将是前八个字符。然后,您可以在找到网址后获得长度:

# Example of list containing urls - you should fill that with your for loop
list_urls = ['https://stackoverflow.com/questions/61006253/use-dynamic-int-variable-inside-regex-pattern-python', 'https://google.com', 'https://stackoverflow.com']
for url in list_urls:
    print(len(url[8:]))

89
10
17

0
投票

一种选择是使用文字字符串内插。假设链接不包含空格,则可以使用\S代替[\w\W],因为后者的变体将匹配包括空格和换行符在内的任何字符。

\bhttps://\S{{{var}}}(?!\S)

Regex demo

最后的断言(?!\S)是空白边界,以防止部分匹配。

Python demo

例如

import re
line = "https://www.test.com"
lines = "https://www.test.com https://thisisatestt https://www.dontmatchme"

var=len(line)-len('https://')
pattern = rf"\bhttps://\S{{{var}}}(?!\S)"

print(re.findall(pattern, lines))

输出

['https://www.test.com', 'https://thisisatestt']
© www.soinside.com 2019 - 2024. All rights reserved.