Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.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_Twitter_Replace - Fatal编程技术网

正则表达式查找&;用python替换电影名称

正则表达式查找&;用python替换电影名称,python,regex,twitter,replace,Python,Regex,Twitter,Replace,我一直在写关于不同电影的tweet(使用Twitter搜索API),现在我想用一个固定字符串替换匹配 我一直在与“圣诞启示录”斗争,因为有很多方法可以在推特上找到它。 我找了“X门启示录”,“X门启示录”,“X门启示录”,“X门”,“X门”,“X门”,它找到了我的匹配,其中还包括“@X门电影”,“\XMen”,,“X门:启示录”,等等 这是我的正则表达式: xmen_regex = re.compile("(((#)x[\-]?men:?(apocalypse)?)|(x[\-]? ?men[:

我一直在写关于不同电影的tweet(使用Twitter搜索API),现在我想用一个固定字符串替换匹配

我一直在与“圣诞启示录”斗争,因为有很多方法可以在推特上找到它。 我找了“X门启示录”“X门启示录”“X门启示录”“X门”“X门”“X门”,它找到了我的匹配,其中还包括“@X门电影”“\XMen”“X门:启示录”,等等

这是我的正则表达式:

xmen_regex = re.compile("(((#)x[\-]?men:?(apocalypse)?)|(x[\-]? ?men[:]?[ ]?(apocalypse)?))")
def re_place_moviename(text, compiled_regex):
    return re.sub(compiled_regex, "MOVIE_NAME", text.lower())
我已经用进行了测试,但在某些边缘情况下仍然不准确,例如:“#xmen blabla”->替换->“#MOVIE#NAME bla”或“MOVIE#namebala”

那么,有更好的方法吗?可能编译不同的正则表达式(在增加长度顺序(?)的基础上)并分别应用它

编辑

约束(或摘要):

(?:^|\s)    : non capture group, begining of string or a space
#           : #
x           : x
[ -]?       : optional space or dash
men         : men
:?          : optional semicolon
\s?         : optional space
apocalypse  : apocalypse
\b          : word boundary
  • 我想找到“x战警”,“x战警”,“x战警”
  • 所有1+“启示录”
  • 所有1+“:启示录”
  • 还有:“#xmen”、“#x-men”、“#xmenapocalypse”、“#x-menapose”
  • 并非所有musn都是子字符串(“xmenmovie”或“lovexmen perfect”),必须在表达式的开头和结尾至少包含1个空格 注:其他电影更容易,但《侠盗一号》等电影有很多表达方式,我们想抓住大部分

    PS1:我知道\b会有帮助,但我不明白它是如何工作的。

    这应该根据您的(模糊的)约束条件来工作:
    (?i)(

    • (?i)
      ——忽略案例标志
    • (?--no
      #
      @
      在'xmen'之前
    • [-]?
      --可选
      -
    • (?!:)
      --在'xmen'后面没有冒号
    • (启示录)?
      ——可选启示录字符串


    编辑:我认为有一个边界(
    \b
    )更合适,而不需要在前面/后面留一个空格,也就是说,
    (?I)\b(?如“xmen”可能是句子的开头。

    这一个应该可以:

    (?:^|\s)#x[ -]?men:?\s?apocalypse\b
    
    更换时,如果您想保留之前的空间,请使用捕获组并将其放入更换零件中:

    (^|\s)#x[ -]?men:?\s?apocalypse\b
    
    说明:

    (?:^|\s)    : non capture group, begining of string or a space
    #           : #
    x           : x
    [ -]?       : optional space or dash
    men         : men
    :?          : optional semicolon
    \s?         : optional space
    apocalypse  : apocalypse
    \b          : word boundary
    

    谢谢!我添加了一个摘要,很抱歉第一次没有这么具体:)我修改了(?I)\b(?谢谢!和我今天提到的一样。问题是,我使用的是re.sub(regx,'MOVIE')这个“非捕获组”,它仍然被替换。即“jaja#xmen jajaja”->jajajamoviejaja@OmarMiranda:您可以使用捕获组
    (^ |\s)
    并将其添加到更换零件中。