正则表达式:字符串的第n次出现

时间:2018-06-22 18:28:47

标签: python regex

我正在尝试使用正则表达式在/字符的第3次和第4次出现之间获取第3个字符串

字符串列表如下:

...
/restaurants/garnish/گارنیش/
/restaurants/burger1358/برگر-۱۳۵۸/
/restaurants/delion-saadat/صبحانه--و-میان-وعده-دلیون-شعبه-سعادت-آباد/
/restaurants/kamran/کامران--اسکای-فال-سابق-/
...

上面列表的期望输出是这样的:

...
گارنیش
برگر-۱۳۵۸
صبحانه--و-میان-وعده-دلیون-شعبه-سعادت-آباد
کامران--اسکای-فال-سابق-
...

由于字符串的所需部分不是ASCII(英语)并且没有模式(名称不同),所以我无法弄清楚正确的正则表达式语法。

3 个答案:

答案 0 :(得分:1)

可能的正则表达式为:

/.+?/.+?/(.+?)/

Demo


但是,正如评论中所指出的那样,您不应该将正则表达式用于简单,过大且性能不佳(也不太可读)的东西。您应该使用str.split

 your_string.split('/')[3]

答案 1 :(得分:0)

如果您知道结构没有改变,请使用str.split。如果url的结构发生变化,而您只想获取波斯字符,则可以使用Unicode字符范围来表示波斯语,以得到所需的结果。

import re 
line = "/restaurants/garnish/گارنیش/"

re.findall("([\u0600-\u06FF\s]+)", line)
['گارنیش']

编辑:如果要查找列表中的每个网址,则需要以下内容:

lines = ['/restaurants/garnish/گارنیش/',
 '/restaurants/burger1358/برگر-۱۳۵۸/',
 '/restaurants/delion-saadat/صبحانه--و-میان-وعده-دلیون-شعبه-سعادت-آباد/',
 '/restaurants/kamran/کامران--اسکای-فال-سابق-/']
[''.join(re.findall("([\u0600-\u06FF\s]+)", n)) for n in lines]

['گارنیش','برگر۱۳۵۸','صبحانهومیانوعدهدلیونشعبهسعادتآباد','کامراناسکایفالسابق']

答案 2 :(得分:0)

您可能不需要正则表达式

res = [w.split('/', 4)[3] for w in s.splitlines() if '/' in w]