0

我正在尝试对文件中的行应用条件处理(由列表中的列表值表示,用于下面的演示目的),并希望endswith(x)在 x 是 range 的方法中使用正则表达式函数page-[1-100])

import re
lines = ['http://test.com','http://test.com/page-1','http://test.com/page-2']
for line in lines:
    if line.startswith('http') and line.endswith('page-2'):
        print line

因此,所需的功能是,如果该值以 范围内的页面开头http和结尾,1-100那么它将被返回。

编辑: 经过反思,我想推论的问题是:

  • 如何制作正则表达式模式,即page-[1-100]变量?
  • 然后我如何使用这个变量x,例如endswith(x)

编辑:

这不是对原始问题的答案(即它不使用startswith()and endswith()),我不知道这是否有问题,但这是我使用的解决方案(因为它实现了相同的功能):

import re
lines = ['http://test.com','http://test.com/page-1','http://test.com/page-100']
for line in lines:
    match_beg = re.search( r'^http://', line)
    match_both = re.search( r'^http://.*page-(?:[1-9]|[1-9]\d|100)$', line)
    if match_beg and not match_both:
        print match_beg.group()
    elif match_beg and match_both:
        print match_both.group()
4

2 回答 2

2

我不太了解 python 来粘贴可用的代码,但就正则表达式而言,这是相当微不足道的:

page-(?:[2-9]|[1-9]\d|100)$

此表达式将匹配的内容:

  • page-只是一个固定字符串,将以 1:1 匹配(如果您为此设置选项,则不区分大小写)。
  • (?:...)是一个非捕获组,仅用于分离以下分支。
  • |所有人都充当“要么或”,表达式在他们的左/右。
  • [2-9]将匹配此数值范围,即 2-9。
  • [1-9]\d将匹配任何两位数字(10-99);\d匹配任何数字。
  • 100又是平淡无奇的搭配。
  • $将匹配行尾或字符串尾(同样基于设置)。

使用此表达式,您不会使用任何特定的“以”结尾功能(通过 using 给出$)。

考虑到这无论如何都必须解析整个字符串,您也可以包括“开始于”检查,这不应该导致任何额外的开销(至少你不会注意到):

^http://.*page-(?:[2-9]|[1-9]\d|100)$
  • ^匹配行或字符串的开头(基于设置)。
  • http://又是一场平淡的比赛。
  • .将匹配任何字符。
  • *是前一个表达式的量词“无或更多”。
于 2013-05-04T11:18:26.483 回答
1

为了让您朝着正确的方向前进,与您所需的页面范围相匹配的正则表达式是:

^http.*page-([2-9]?|[1-9][0-9]|100)$

这将匹配以inclusive开头http和结尾的行。page-<2 to 100>

于 2013-05-04T11:15:59.310 回答