首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找和替换电影名称python的Regex

查找和替换电影名称python的Regex
EN

Stack Overflow用户
提问于 2017-01-04 22:48:31
回答 2查看 140关注 0票数 1

我一直在写关于不同电影的推文(使用),现在我想用一个固定的字符串替换匹配。

我一直在与"XMen启示录“作斗争,因为有很多方法可以在推特上找到这一点。我查找了“X战警启示录”“X战警启示录”"X战警启示录“"XMen"”X战警“e 29E 110”X Men“E 211,并检索了我的匹配项,其中还包括E 114”#xmen“E 215E 116”x-men: apocalypse"等等……

这是我的准则:

代码语言:javascript
复制
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())

我已经用RegExr进行了测试,但在某些边缘情况下仍然不准确,比如:'#xmen blabla‘->代替-> '#MOVIE_NAME blabla’或‘->_NAMEblabla’。

那么,有更好的方法来做这个吗?可能编译不同的正则表达式(关于增加长度顺序(?))单独应用吗?

编辑

约束(或摘要):

  1. 我要找到"x-men","x men","xmen“
  2. 所有1+“启示录”
  3. 所有1+ ":启示录“
  4. 还有:"#xmen","#x-men",“#xmena便耳”,“#x-启示”
  5. 所有不应该是子字符串("@xmenmovie“或"lovexmen”),必须在表达式的开头和结尾至少包含一个空格。

PS:其他电影比较容易,但是xmen和其他像Rogue这样的电影有很多表达方式,我们想抓住其中的大部分。

PS1:我知道\b可以帮上忙,但我不明白它是如何工作的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-05 16:39:02

这个人应该做好以下工作:

代码语言:javascript
复制
(?:^|\s)#x[ -]?men:?\s?apocalypse\b

如果需要替换,如果要保留之前的空间,请使用捕获组并将其放在替换部分:

代码语言:javascript
复制
(^|\s)#x[ -]?men:?\s?apocalypse\b

解释:

代码语言:javascript
复制
(?:^|\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
票数 1
EN

Stack Overflow用户

发布于 2017-01-05 00:07:10

这应该根据您的(模糊的)约束来工作:(?i)(?<![#@])x[- ]?men(?!:)( apocalypse)?

  • (?i) --忽略case标志
  • (?<![#@]) --在“xmen”之前没有#@
  • [- ]? --可选的-
  • (?!:) --在“xmen”之后没有冒号
  • ( apocalypse)? --可选启示录字符串

编辑:不需要在前面/后面有一个空格,我认为有一个边界(\b)将更合适,即(?i)\b(?<!@)(x[- ]?men:?\s?(?:apocalypse)?)\b作为'xmen‘可以开始句子。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41474535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档