我用Python学习了很多正则表达式,我很难用正则表达式来支持没有连续4个或更多重复字符的测试用例,我在互联网上找到了简单的解决方案,但我需要判断不包括"-"字符的重复字符,例如:

bic-hota  // Valid
bichota  // Valid
bichota1234 // Valid
bich222ota // Valid, sequence "222" with length of 3 is allowed 

bichota2222 // Invalid because have "2222" and isn't allowed length of 4 or more
bichota22-22 // Invalid because have "2222" (ignore the '-') and isn't allowed length of 4 or more

在最后一个测试用例中,您可以看到序列"22-22",我需要忽略序列之间的"-",以验证整个序列,我已经搜索了如何解决这个问题,我使用了非捕获组(?:-?),但这不起作用:(

^(?![\w]*([\w])(?:-?)\1{3,})[\w-]+$

我的正则表达式有什么问题,如何修复?

测试用例:https://regexr.com/6p0ca

推荐答案

您可以使用此正则表达式:

^(?!.*(\w)(?:-?\1){3}).+

RegEx Demo

RegEx Details:

  • ^:开始
  • (?!: Start negative lookahead
    • .*:匹配任意长度的字符
    • (\w):匹配角色并在组#1中捕获
    • (?:-?\1){3}:匹配可选-,然后反向引用组#1.重复此组3次.
  • ):结束负前瞻
  • .+:匹配任意字符的1+

要仅允许使用文字字符和连字符,请执行以下操作:

^(?![\w-]*(\w)(?:-?\1){3})[\w-]+$

Python-3.x相关问答推荐

我们可以在每个可以使用 Pandas Join 的用例中使用 Pandas merge 吗?

查找值始终为零的行 pandas

类变量的Python子类被视为类方法

如何使用python将pdf文件的页面合并为单个垂直组合页面

Sunburst 折线图可视化

将自动文本转换为 DataFrame

Pandas 窗口聚合两个排序表

将 pandas Timestamp() 转换为 datetime.datetime() 以支持 peewee DateTimeField()

Snakemake 'run' 指令不产生错误信息

两个Pandas数据框中的共同列列表

Seaborn 热图 colored颜色 条标签作为百分比

如何使用pandas python获取数据框中每列的最大长度

Python:如何判断一个项目是否被添加到一个集合中,没有 2x(hash,lookup)

如何判断一个字符串是否包含有效的 Python 代码

sys.stdin.readline() 读取时没有提示,返回 'nothing in between'

发送Electron邮件时的 MIMEText UTF-8 编码问题

如何在继承的数据类中创建可选字段?

为什么某些代码在 Python2 中是确定性的,而在 Python 3 中是非确定性的?

在 Visual Studio Code 中调试 Scrapy 项目

Python MySQLdb - 类中的连接