gpt4 book ai didi

python - 如何使用正则表达式来匹配文件中其他小写单词不连续重复的大写单词

转载 作者:行者123 更新时间:2023-12-01 08:35:23 25 4
gpt4 key购买 nike

我是正则表达式的菜鸟,需要一些帮助。我对正则表达式字符类、 anchor 和环视有基本的了解,但事实证明这个特定的用例对我来说很困难。

我正在尝试解析每月运行的脚本的输出,该脚本输出用于库存目的的用户列表。我想使用正则表达式来解析文件以匹配这些条件:

  1. 正则表达式查找重复为大写单词的小写单词。这些大写单词不在同一行,是非连续出现的,并且可以位于新行或文件中的其他位置。
  2. 我需要一个能够显示重复的大写匹配的正则表达式
  3. 另一个删除重复大写匹配的正则表达式

这是我尝试解析的文件输出的示例:

"hello","2018-11-19","unitelife"
"world","2018-11-09","unitelife"
"foo","2018-11-16","unitelife"
"bar","2018-10-05","unitelife"
"hello123","2018-09-06","unitelife"
"HELLO123","2018-11-18","unitelife"
"FOO","2018-11-20","unitelife"
"WOWMUCHHAPPY","2018-10-20","unitelife"
"suchjoy","2017-11-28","unitelife"

我正在寻找的所需匹配项是:

HELLO123
FOO

我已经尝试了下面引用的 URL 讨论中建议的多种组合,但似乎没有任何效果对我有用。要么我尝试了错误的组合,要么此功能无法实现。此外,大多数主题都在讨论连续的单词或字母/字符。

如果之前讨论过这个问题或者分类不正确,我想提前道歉。请让我知道而不是投反对票,以便我可以编辑、关闭或重新分类问题以满足相应的标准。

真诚的,

一个谦虚的学生

最佳答案

您可以使用该模式

(?sm)^"([a-z\d]+)"(?i)(?=(?:[^\n]*\n)+?"(?=\1")(?-i)[A-Z\d]+")

https://regex101.com/r/nM3iBH/2

这个想法是,首先区分大小写(没有 i),并匹配引号内行开头的小写字符串。然后,启用区分大小写的标志,并在引号内的行开头处向前查找相同的字符串。重新启用区分大小写,并在前瞻中再次匹配同一字符串,仅允许使用大写字母(和数字)。

请注意,此问题(与此问题的任何正则表达式算法一样)具有 O(N^2) 复杂度,因为对于任何匹配,您都需要检查整个剩余子字符串以查找(大写)匹配.

另请注意使用 " 而不是您正在考虑的 \b - 使用 " 更精确这种输入将导致总体步骤显着减少。

为了减少步骤,模式相当严格。分离出来:

  • (?sm)^"([a-z\d]+)" - 初始标志,捕获行首引用的小写单词
  • (?i) - 启用不区分大小写,以便将来的 \1 反向引用能够正常工作
  • (?=(?:[^\n]*\n)+?"(?=\1")(?-i)[A-Z\d]+") 大前瞻为了:
    • (?:[^\n]*\n)+ - 匹配非换行符,后跟换行符
    • "(?=\1") 反向引用行首引号内的原始匹配单词
    • (?-i) 重新启用区分大小写,以便检查大小写
    • [A-Z\d]+" - 匹配大写字母和数字,后跟 "

为了用空字符串替换大写单词行,而不是使用大的前瞻,匹配组中小写单词和大写单词之间的所有内容(这样你有两组,小写单词,以及它后面的所有内容,直到大写单词),然后匹配大写单词,并仅替换前两组(从而替换大写单词的行) :

(?sm)^("[a-z\d]+")(?i)((?:[^\n]*\n)*[^\n]*)\n(?=\1)(?-i)"[A-Z\d]+"[^\n]*

替换为

\1\2

(或您环境中的同等内容)

https://regex101.com/r/nM3iBH/3

请注意,如果有重叠的匹配项,则必须迭代执行此操作,直到没有匹配项为止。

关于python - 如何使用正则表达式来匹配文件中其他小写单词不连续重复的大写单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53754298/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com