Python中的字符串比较

3

我有一个字符串数组,例如

urls_parts=['week', 'weeklytop', 'week/day']

我需要监控我的url中是否包含这些字符串,所以这个例子只需要通过weeklytop部分来触发:
url='www.mysite.com/weeklytop/2'
for part in urls_parts:
    if part in url:
       print part

当然,“week”也会触发它。正确的做法是什么?

糟糕,让我稍微说明一下我的问题。 我需要当url='www.mysite.com/week/day/2'和part='week'时,该代码不会触发。 唯一需要触发的URL是part='week'且url='www.mysite.com/week/2'或'www.mysite.com/week/2-second'等。


1
使用urllib.urlparse()解析URL,拆分遍历部分,然后逐个字符串进行比较。这是作业吗? - user2665694
你的 url_parts 中每个部分都有模式“week”,你如何期望计算机在没有对 url 进行标记化的情况下区分它们呢?你需要至少定义单词边界,然后才能按照上述方式进行匹配...或者使用正则表达式。 - Yang
5个回答

5
这是我会做的方式。
import re
urls_parts=['week', 'weeklytop', 'week/day']
urls_parts = sorted(urls_parts, key=lambda x: len(x), reverse=True)
rexes = [re.compile(r'{part}\b'.format(part=part)) for part in urls_parts]

urls = ['www.mysite.com/weeklytop/2', 'www.mysite.com/week/day/2', 'www.mysite.com/week/4']
for url in urls:
    for i, rex in enumerate(rexes):
        if rex.search(url):
            print url
            print urls_parts[i]
            print
            break

输出

www.mysite.com/weeklytop/2
weeklytop

www.mysite.com/week/day/2
week/day

www.mysite.com/week/4
week

建议按照长度排序来自@Roman。

3

len对列表进行排序,并在第一次匹配时从循环中break


2

试试这样做:

>>> print(re.findall('\\weeklytop\\b', 'www.mysite.com/weeklytop/2'))
['weeklytop']
>>> print(re.findall('\\week\\b', 'www.mysite.com/weeklytop/2'))
[]

程序:

>>> urls_parts=['week', 'weeklytop', 'week/day']
>>> url='www.mysite.com/weeklytop/2'
>>> for parts in urls_parts:
    if re.findall('\\'+parts +r'\b', url):
        print (parts)

输出:

weeklytop

0

为什么不像这样使用urls_parts呢?

 ['/week/', '/weeklytop/', '/week/day/']

我使用这个,这只是一个例子。 - Feanor

-1
您的代码稍作改动即可解决此问题 -
>>> for part in urls_parts:
        if part in url.split('/'):              #splitting the url string with '/' as delimiter
            print part

    weeklytop

1
不是我,但例如'week/day'就不能用这种方式找到。 - pepr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接