Regex 用于唯一用户计数的正则表达式

Regex 用于唯一用户计数的正则表达式,regex,Regex,我正在尝试创建一个正则表达式来检查唯一用户的数量。 在这种情况下,一个字符串中有3个不同的用户意味着它是有效的。 假设我们有以下字符串 实验室\西蒙;实验室\列文;实验室\ tim\实验室\戴维;实验室\列文 它包含每个用户(实验室)的域及其名字。 每一个用户都是由不同的用户来分隔的 目标是在一个字符串中有3个唯一的用户。 在本例中,字符串是有效的,因为我们有以下唯一的用户 西蒙、利文、蒂姆、戴维=有效 如果我们拿这根绳子 实验室\西蒙;实验室\列文;实验室\西蒙 它无效,因为我们只有2个唯一的

我正在尝试创建一个正则表达式来检查唯一用户的数量。 在这种情况下,一个字符串中有3个不同的用户意味着它是有效的。 假设我们有以下字符串

实验室\西蒙;实验室\列文;实验室\ tim\实验室\戴维;实验室\列文

它包含每个用户(实验室)的域及其名字。 每一个用户都是由不同的用户来分隔的

目标是在一个字符串中有3个唯一的用户。 在本例中,字符串是有效的,因为我们有以下唯一的用户

西蒙、利文、蒂姆、戴维=有效

如果我们拿这根绳子

实验室\西蒙;实验室\列文;实验室\西蒙

它无效,因为我们只有2个唯一的用户

西蒙,列文=无效

到目前为止,我只提出了以下正则表达式,但我不知道如何继续

/(lab)\\(?:[a-zA-Z]*)/g
你能帮我弄一下这个正则表达式吗


如果您需要更多信息(如果不清楚),请告诉我。

您所追求的东西无法通过正则表达式自己实现。正则表达式用于解析信息,而不是进行处理

没有您想要的特定模式,这正是正则表达式擅长的。您需要按
进行拆分
并使用数据结构(如集合)存储字符串值

这就是您想要的:

1) 使用正则表达式:

import re

s = r'lab\simon;lab\lieven;lab\tim;\lab\davy;lab\lieven'
pattern = re.compile(r'lab\\([A-z]{1,})')
user = re.findall(pattern, s)

if len(user) == len(set(user)) and len(user) >= 3:
    print('Valid')
else:
    print('Invalid')
s = r'lab\simon;lab\lieven;lab\tim;\lab\davy;lab\lieven'
users = [i.split('\\')[-1] for i in s.split(';')]

if len(users) == len(set(users)) and len(users) >= 3:
    print('Valid')
else:
    print('Invalid')
2) 不使用正则表达式:

import re

s = r'lab\simon;lab\lieven;lab\tim;\lab\davy;lab\lieven'
pattern = re.compile(r'lab\\([A-z]{1,})')
user = re.findall(pattern, s)

if len(user) == len(set(user)) and len(user) >= 3:
    print('Valid')
else:
    print('Invalid')
s = r'lab\simon;lab\lieven;lab\tim;\lab\davy;lab\lieven'
users = [i.split('\\')[-1] for i in s.split(';')]

if len(users) == len(set(users)) and len(users) >= 3:
    print('Valid')
else:
    print('Invalid')

为了成功匹配,我们需要至少3套
lab\user
,即:

(?:\\?lab\\[\w]+(?:;|$)){3}
您没有指定引擎,但使用
python
可以使用:

import re

if re.search(r"(?:\\?lab\\[\w]+(?:;|$)){3}", string):
    # Successful match
else:
    # Match attempt failed


正则表达式解释

(?:\\?lab\\[\w]+(?:;|$)){3}

Match the regular expression «(?:\\?lab\\[\w]+(?:;|$)){3}»
   Exactly 3 times «{3}»
   Match the backslash character «\\?»
      Between zero and one times, as many times as possible, giving back as needed (greedy) «?»
   Match the character string “lab” literally «lab»
   Match the backslash character «\\»
   Match a single character that is a “word character” «[\w]+»
      Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
   Match the regular expression below «(?:;|$)»
      Match this alternative «;»
         Match the character “;” literally «;»
      Or match this alternative «$»
         Assert position at the end of a line «$»

以下是一个初学者友好的解决问题的方法:

  • 您应该.split()为每个“lab”部分指定字符串,并将结果声明为数组变量,如splitted_string
  • 声明第二个空数组以保存每个唯一的名称,如唯一的\u名称
  • 使用for循环迭代分割的_字符串数组。检查唯一名称:如果它不在唯一名称数组中,请将该名称添加到唯一名称中
  • 查找唯一_名称数组的长度,看看它是否等于3。如果是,请打印它是。如果没有,则打印失败消息
  • 您似乎是一个实际的人,对字符串操作比较陌生。也许你会喜欢在初学者网站上阅读一些关于字符串操作的实用背景资料,比如用Python自动化那些无聊的东西:
    或编解码器等。

    这可以通过一个简单的正则表达式来完成。
    为每个用户名槽使用一个条件,以便 获得三个名称

    请注意,由于三个插槽在一个循环中,因此条件保证了
    未覆盖捕获组(这将使下面提到的内容无效
    断言测试
    (?!\1\2\3)

    这是一个复杂的问题。每个用户名使用相同的正则表达式
    [a-zA-Z]+
    为了适应这种情况,定义了一个函数来检查插槽
    以前没有匹配过

    这是使用助推引擎,这在美容上要求团队成为
    在它被反向引用之前定义。
    解决方法是在定义组后在底部定义函数

    在PERL(和一些其他引擎)中,不需要提前定义组
    返回引用之前的时间,因此您可以取消该函数

    (?! \1 | \2 | \3 )       # Cannot have seen this user
    [a-zA-Z]+  
    
    在上面的捕获组中

    这至少需要条件

    (?:(?:*)\blab\\(?:((?(1)(?!)(?&GetUser)))((?(2)(?!)(?&GetUser)))((?(3)(?!)(?&GetUser(定义)(?!\1 |\2 |\3)[a-zA-Z]+)
    #寻找3个独特的用户
    (?:
    (?:
    .*? 
    \b实验室\\
    (?:
    (#(1),用户1
    (?(1) (?!) )
    (?&GetUser)
    )
    |(#(2),用户2
    (?(2) (?!) )
    (?&GetUser)
    )
    |(#(3),用户3
    (?(3) (?!) )
    (?&GetUser)
    )
    )
    )
    ){3}
    (?(定义)
    (?                   # (4)
    (?!\1 |\2 |\3)无法看到此用户
    [a-zA-Z]+
    )
    )
    
    这项运动的另一个纯粹的正则表达式答案。正如其他人所说,你可能不应该这样做

    ^([^;]+)(;\1)*;((?!\1)[^;]+)(;(\1|\3))*;((?!\1|\3)[^;]+)
    
    说明:

    ^                 from the start of the string
    ([^;]+)           we catch everything that isn't a ';'.
                       that's our first user, and our first capturing group
    (;\1)*            it could be repeated
    ;((?!\1)[^;]+)    but at some point, we want to capture everything that isn't either
                       our first user nor a ';'. That's our second user,
                       and our third capturing group
    (;(\1|\3))*       both the first and second user can be repeated now
    ;((?!\1|\3)[^;]+) but at some point, we want to capture yada yada,
                       our third user and fifth capturing group
    

    您使用的是哪个引擎?这听起来像是一个字符串拆分和排序的工作,而不是正则表达式。您希望用户名是相互唯一的还是一个字符串中的任意三个,例如simon、liven、simon=[in]有效?您使用的是哪种编程语言?谢谢您的评论。今天我正在做另一个项目,所以我现在没有时间测试这些解决方案。一旦我有时间测试,我会更新这个线程。在这种情况下,如果您强制正则表达式匹配至少3个组,我想您可以。@Pedrolobto:是的,但我几乎不会叫sol可伸缩性。