有没有办法将以下三个表达式合并为一个正则表达式?

name = re.sub(r'\s?\(\w+\)', '',name) # John Smith (ii) --> John Smith
name = re.sub(r'\s?(Jr.|Sr.)$','', name, flags=re.I) # John Jr. --> John
name = re.sub(r'".+"\s?', '', name) # Dwayne "The Rock" Johnson --> Dwayne Johnson

#1楼 票数:6 已采纳

你可以使用分组和管道:

re.sub(r'(\s?\(\w+\))|(s?(Jr.|Sr.))|(".+"\s?)', '', name)

演示

#2楼 票数:1

如果你想获得一个有效的(并且大部分时间都在工作)模式,简单地用管道分离你的模式是一个坏主意。 你必须重新考虑你想对你的模式做什么,并从头开始重写它。

p = re.compile(r'["(js](?:(?<=\b[js])r\.|(?<=\()\w+\)|(?<=")[^"]*")\s*', re.I)
text = p.sub('', text).rstrip()

这是对您之前撰写的内容持批评态度的好机会:

  • 用可选字符\\s?开始一个模式\\s? 很慢,因为字符串中的每个位置都必须使用和不使用此字符进行测试。 因此,最好在末尾捕获可选的空格并在之后修剪字符串。 (在所有情况下,即使你决定在开始时捕获可选的空格,你也需要修剪结果)
  • 找到引用部分的模式是错误的和低效的(当它工作时),因为你使用一个带有贪心量词的点,所以如果在同一行中有两个引用的部分(注意点与新行不匹配)所有之间的内容也将匹配。 最好使用不包含引号的否定字符类: "[^"]*" (注意:这可以改进以处理引号内的转义引号)
  • Jr.Sr.的模式也是假的,以匹配文字. 你需要逃脱它。 除此之外,该模式太不精确,因为它不会检查之前是否还有其他单词字符。 它将匹配例如以“USSR”结尾的句子。 或任何包含“jr”的子串。 或“sr。”。 (要完全严谨,你必须检查之前是否有空格或字符串的开头,但一个简单的单词边界应该足够大部分时间)

现在如何建立你的交替:

顺序可能很重要,特别是如果子模式不是mutualy排他性的。 例如,如果你有子模式a+ba+ ,如果你写a+|a+b所有前面带有ab将永远不会匹配,因为第一个分支之前成功。 但是对于你的例子,没有这种问题。

顺便说一句,如果你知道其中一个分支机构有更多机会成功,那就把它放在交替的第一个位置。

你知道搜索到的子字符串以这些字符之一开头: "(js 。在这种情况下,为什么不用["(js]开始模式,避免测试字符串中所有位置的模式的每个分支。然后,由于已经消耗了第一个字符,因此您只需要使用lookbehind检查每个分支中哪些字符匹配。

通过这些小改进,您可以获得更快的模式。

  ask by David542 translate from so

未解决问题?本站智能推荐:

1回复

如何结合 for 循环和正则表达式?

我有一个 SQL 表,如下所示 (声望不够,不能直接发图) 我正在尝试将不同的词分类为名词、副词、形容词等(一个词可以有多个分类,例如此屏幕截图中的“放弃”一词)。 我在同一个数据库中有另一个表,我已将其作为列表加载到我的程序中。 使用嵌套的 for 循环和正则表达式,我试图获取它的单词类型。
1回复

三个数字的正则表达式

我创建了一个正则表达式,可以匹配四位数字中任意顺序的两个数字。 我正在尝试创建一个可以以任意顺序对四位数中的3个数字进行数学运算的正则表达式。 以下是我目前用来匹配两个数字的内容: 匹配0和1在7019 , 8019 , 2160 。 未来的正则表达式必须匹配0 , 1和2 。
1回复

匹配正则表达式中的三个匹配项

这是我的语法正则表达式: 这是一个表达 我需要: SL 5123 5016 SL 5445C 297741 SL 1288C 8709N5 语法正则表达式不起作用。 错误在哪里? 在我使用语法的地方,只有两个结果 SL 5123
2回复

正则表达式仅绕过三个点

我有这个字符串: 我想捕捉到. , ? 和! 而不是...子字符串,因此所需的输出应为: 这就是我得到的: 此正则表达式还捕获...子字符串的第一个点。 但是如果我运行: 与我的预期正好相反,我不明白为什么,因为我要先行查询两个点是否不匹配(尝试使用量词的
1回复

正则表达式提取包含三个元音的单词

我正在尝试创建一个函数来从以下字符串中提取具有 3 个连续元音的单词 但是我得到的输出如下: 有人可以帮我纠正我的正则表达式模式,以便它提取完整的单词。 谢谢你。
2回复

Python正则表达式搜索三个术语

我是Python和Regex的新手,我有点困惑。 我想搜索三个不同术语的网页标题,如果标题匹配我想要打印的标题(我正在使用scrapy,所以它为每个项目打印)。 我不确定我们如何通过这三个术语进行搜索? 例如,如果标题有“Dresses | Wallets | Pumps”打印出来。
4回复

结合负前瞻和正则表达式

我想要一个正则表达式,它将在每个"."分割一个字符串"." 除非"." 前面跟着一个数字。 例: "hello world.foo 1.1 bar.1" ==> ["hello world","foo 1.1 bar", "1"] 我目前有: 但它给出了:
2回复

结合编译的Python正则表达式

Python中是否有任何组合编译正则表达式的机制? 我知道可以通过从现有模式对象中提取plain-old-string .pattern属性来编译新表达式。 但这在几个方面失败了。 例如: 我正在寻找的结果在Perl中是可以实现的: 测试显示结果: 是否有某个库