Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 随机顺序的正则表达式多重匹配_Python_Regex - Fatal编程技术网

Python 随机顺序的正则表达式多重匹配

Python 随机顺序的正则表达式多重匹配,python,regex,Python,Regex,我可以有这样的字符串: movie = '007: Spectre English Trailer #3 2015' or 007: Spectre (2015) English Trailer or 007: Spectre 2015 Trailer 2 etc. 目前我有下一段代码: lang = 'english' year = 2015 video_type = 'trailer' num = 3 # for example '3', but can be any my_list =

我可以有这样的字符串:

movie = '007: Spectre English Trailer #3 2015'
or
007: Spectre (2015) English Trailer
or
007: Spectre 2015 Trailer 2
etc.
目前我有下一段代码:

lang = 'english'
year = 2015
video_type = 'trailer'
num = 3 # for example '3', but can be any

my_list = []

if re.search(video_type+r'\s+((?#|№)['+str(num)+']\D)', movie, re.IGNORECASE):
    my_list.append(movie)
检查字符串中是否存在
video\u type
num
预告片


如何将
lang
year
添加到正则表达式中,以检查
lang
year
video\u type
num
是否都在字符串中?换句话说,我需要检查字符串是否包含所有这些变量

有些人认为:

if (lang in movie) and (year in movie) and (video_type in movie) and (num in movie):
    my_list.append(movie)
所有这些变量都可以位于字符串的随机位置(除了
video_type
num
之外,因为它们总是彼此靠近,上面的代码工作正常)


尝试了如下操作:

您的注释表明您真正关心的是以下字段是否存在于字符串中的任何位置:

  • lang
  • 年份
  • 视频类型num
    视频类型num
    视频类型№num
您应该使用regex来检测最后一个,但是其他的应该只是一个简单的
检查

m = movie.casefold()  # .lower() in earlier versions before 3.3
if all([lang in m,
        year in m,
        re.search(r"{} (?:#|№)?{}(?=\D|$)".format(video_type, num), m)]):
    # do something
这相当于:

if lang in m and year in m and re.search(r"{} (?:#|№)?{}(?=\D|$)".format(video_type, num), m):

但是更具可读性

您的注释表明您真正关心的是以下字段出现在字符串中的任何位置:

  • lang
  • 年份
  • 视频类型num
    视频类型num
    视频类型№num
您应该使用regex来检测最后一个,但是其他的应该只是一个简单的
检查

m = movie.casefold()  # .lower() in earlier versions before 3.3
if all([lang in m,
        year in m,
        re.search(r"{} (?:#|№)?{}(?=\D|$)".format(video_type, num), m)]):
    # do something
这相当于:

if lang in m and year in m and re.search(r"{} (?:#|№)?{}(?=\D|$)".format(video_type, num), m):

但是它更具可读性

你想用它做什么?可能有更好的方法。我需要检查字符串是否包含lang、year、video_type和numYes,我可以读取您的代码。什么是
#做点什么
(用简单的英语)。现在看来最好的选择是
all(电影中的field.lower()代表[lang,year,video\u type,num])
我认为你不可能通过一次检查就能做到这一点(或者如果你这样做,以后很难阅读/调试)。我认为您必须为每个可能的订购创建一个案例。
(?#在这里进行注释,而不是regex)
您想用它做什么?可能有更好的方法。我需要检查字符串是否包含lang、year、video_type和numYes,我可以读取您的代码。什么是
#做点什么
(用简单的英语)。现在看来最好的选择是
all(电影中的field.lower()代表[lang,year,video\u type,num])
我认为你不可能通过一次检查就能做到这一点(或者如果你这样做,以后很难阅读/调试)。我认为你必须为每个可能的订购创建一个案例。
(?#在这里评论,而不是regex)
Wow。完美的我可以请你为我刚找到的另外一件事编辑你的代码吗?因为regexp让我发疯了007:Spectre英语预告片#2 2015“还可以,但007:Spectre英语预告片2015”也可以。您是否可以编辑您的代码以忽略“num”后超过1位的字符串,从而允许re接受结尾部分为“Trailer#2 2015”、“Trailer#2(2015)”、“Trailer#2”、“Trailer#2 English”等的字符串,但不接受Trailer 2015?Thansyeap。目前,re不接受要求的“拖车2015”,但也不再接受“拖车2”,但我需要它:(@TitanFighter-Ah我没想到这是最后一行。它现在应该可以工作了哇。太好了。我可以请你为我刚找到的另一个东西编辑你的代码吗?因为regexp让我发疯了?'007:Spectre English Trail#2 2015'可以,但是'007:Spectre English Trail 2015'也可以。你能编辑你的代码来忽略带有m的字符串吗“num”后大于1位,因此允许re接受带有结尾部分的字符串,如“Traile#2 2015”、“Traile#2(2015)”、“Traile#2”、“Traile#2 English”等,但不包括“Traile 2015”?Thansyeap。目前,re不接受要求的“Traile 2015”,但也不再接受“Traile 2”,但我需要它:(@TitanFighter-Ah我没想到它已经到了终点,现在应该可以用了