Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.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 正则表达式a^xb^y替换_Python_Regex_Substitution - Fatal编程技术网

Python 正则表达式a^xb^y替换

Python 正则表达式a^xb^y替换,python,regex,substitution,Python,Regex,Substitution,我想在python中找到一个正则表达式,以便确定具有以下形状的用户条目 a^xb^y 当在字符串中找到这样的条目时,我想将其标记为垃圾邮件 a:可以是任何角色 b: 可以是除在 x>=2,y>=2 示例: “此文本是一个GGEEEFFF示例”应匹配(GGEEEFFF) “xxoxo也许这会有帮助”不应该匹配 “yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy 我尝试的代码: s

我想在python中找到一个正则表达式,以便确定具有以下形状的用户条目

a^xb^y

当在字符串中找到这样的条目时,我想将其标记为垃圾邮件

a:可以是任何角色

b: 可以是除在

x>=2,y>=2

示例:

  • “此文本是一个GGEEEFFF示例”匹配(GGEEEFFF)

  • “xxoxo也许这会有帮助”不应该匹配

  • “yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy

我尝试的代码:

string = "hello is abbbb aabbbbbcccddddddd...eefffggggggghhhhiiii,,,???jj"

reg1 = re.compile("(.)\1{1,}")
match = reg1.match(string)
print(match)
OUT:
None
但是,当我使用re.sub时,它确实会替代它

string_sub = re.sub(r"(.)\1{1,}", r"\1", string)
print(string_sub)
输出:
直升机是ab abcd.efghi,?j

这应该不会发生,因为“hello”应该保持为“hello”,而“abbb”也应该保持为“abbb”。“aabbbbbcccddddd…eefffgggggghhhhiii,,,,??jj”已正确转换。我认为可以替换,因为
len(string)
len(string)
有效。然后我可以用它来标记字符串:

if(len(string_sub) < len(string)):
    print("String flagged as spam.")
else:
    print("String NOT flagged as spam.")

您的原始正则表达式应该可以工作,但是为什么您对这两个
{1,}
都使用
\1

它应该是这样的
()\1{1,}(?!\1)()\2{1,}
,问题是它也会匹配像
111222
这样的数字,所以我认为最好使用
[A-Za-z]
或者只使用
[A-z]
I
标志

你的正则表达式也不匹配一个完整的单词,我不知道这是否是故意的

您可能可以使用:

  • 匹配具有此模式的完整单词

    • \b([A-Za-z])\1{1,}(?!\1)([A-Za-z])\2{1,}\S*\b
    • \b\w+([A-Za-z])\1{1,}(?!\1)([A-Za-z])\2{1,}\S*\b
    如果不想让
    \S*
    与第一个空格匹配,可以将其删除

  • 如果你只想在任何地方找到它

    • ([A-Za-z])\1{1,}(?!\1)([A-Za-z])\2{1,}

  • 这是一个相当糟糕的垃圾邮件过滤器。任何人都不允许谈论气球、浣熊、痰盂或委员会……这是一个很好的暗示。但是,由于每个条目也将在以后进行审查,因此使用它是有意义的。背后的原因是,我使用亵渎模型来预测条目是否包含亵渎。不幸的是,我们还想去掉像“aabb”这样的条目。因此,放在模型前面的正则表达式过滤器应该可以工作。通常我会想捕捉所有的字符,但是对于数字来说,把它们去掉是有意义的。所以代替[A-Za-z]->[\D]对我来说应该很好。谢谢:)
    string_sub2 = re.sub(r"(.)\1{1,}(?!\1)(.)\1{1,}",r"\1\1", string)