【问题标题】:How can I create a new list with each element a regular expression of each element of another list in python?如何创建一个新列表,其中每个元素是 python 中另一个列表的每个元素的正则表达式?
【发布时间】:2012-05-05 20:38:28
【问题描述】:

我一直在尝试一些不同的语法,但似乎没有任何效果,我遇到了语法错误“TypeError: 'str' object does not support item assignment”等等

for url in urls:
  for i in range(len(urls)):    
    filename[i] = [re.search(r'/([.]+)(.pdf)') for url[i] in urls]

我也试过了:

for url in urls:
    filename[i] = [re.search(r'/([.]+)(.pdf)') for url[i] in urls for i in range(len(urls))]

还有其他一些排列。我一直认为列表理解是执行此操作的最佳方法,但我不确定我需要使用的语法。 请帮忙?

【问题讨论】:

    标签: python list python-3.x list-comprehension


    【解决方案1】:

    您在列表理解方面走在了正确的轨道上,但您让它变得比现在更复杂:

    [re.search(r'/([.]+)(.pdf)', url) for url in urls]
    

    请注意,这将是一个匹配列表,例如,如果你想要它找到的组,忽略它不匹配的任何 url,你可以这样做:

    [match.groups() for match in (re.search(r'/([.]+)(.pdf)', url) for url in urls) if match]
    

    它使用嵌套生成器表达式来检查是否匹配,如果匹配则从中提取组:

    >>> urls = ["http://wwww.example.com/test.html", "http://www.example.com/test.pdf"]
    >>> [match.groups() for match in (re.search(r'/([^/]+)(.pdf)', url) for url in urls) if match]
    [('test', '.pdf')]
    

    在这里,我对您的正则表达式进行了轻微编辑,以使其适用于我的示例,这仅用于示例。

    当然,您可以在此处使用match objects 做任何您想做的事情,而不仅仅是获取match.groups()

    【讨论】:

    • 谢谢,这似乎应该可以工作,但唯一的问题是我的结果列表中充满了像“_sre.SRE_Match object at 0x1544ba0”这样的对象,虽然我之前确实遇到过这个问题并且一直能够将这些转换为字符串,我现在似乎不知所措-有什么帮助吗?谢谢。
    • @rab777hp 请参见我的第二个示例。
    • @rab777hp 这意味着所有匹配项都是空的。您可能想检查您的正则表达式是否正确。您当前的匹配任意数量的"."s,后跟".pdf"
    • 是的,我一直在搞乱并试图让这些东西工作,但 .pdf 之前的东西是数字和字母的随机文本。我虽然把 .在像 [.] 这样的括号中,即使它在 () 中,它也意味着任何东西
    • @rab777hp 恰恰相反。 . 表示任何东西除非你把它放在方括号中或用反斜杠转义。请参阅我的第三个示例,其中我将正则表达式用于除 / 之外的任何内容。
    【解决方案2】:

    使用列表推导,我创建了一个 url 列表,并且 url 正则表达式结果只有在匹配模式时才会插入到新列表中

    file_regex = re.compile(r'/([a-zA-Z0-9]+)(.pdf)')
    
    filenames = [file_regex.search(url) for url in urls if file_regex.match(url)]
    
    print filenames
    

    【讨论】:

    • 这有点浪费,因为它必须匹配正则表达式两次。
    • @Brian:即使使用已编译的正则表达式,它仍在检查匹配项,然后再次找到匹配项并存储它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    • 2017-01-12
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2016-09-13
    • 1970-01-01
    相关资源
    最近更新 更多