正则查找自用

文章介绍了正则表达式的语法,包括非捕获组的概念,如何修正无效的正则表达式,以及如何匹配特定格式的字符串。通过实例解析了正则模式如(P#s+d+/)的含义,并展示了如何在Python中使用正则进行匹配和处理。
摘要由CSDN通过智能技术生成

1、正则语法记录
①摘自菜鸟在线正则
在这里插入图片描述
②详细
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、记录初次写正则的修正过程
试图得到正则匹配: (?:[P#\s+24/)

([P#)(\s)+(24/)   nodepade++显示无效的正则表达式
原因:
在正则表达式中括号需要成对出现,且不同类型的括号应该分别使用。

正确的正则表达式是:(?:P#\s+24\/)

这个正则表达式的意思是匹配一个以P#开头,接着包含至少一个空格字符,然后包含24/的字符串。

具体来说:

(?: - 开始一个非捕获组。
P# - 匹配"P#"的字面文本。
\s+ - 匹配至少一个连续的空格字符。\s是一个特殊字符类,表示任何空白字符(包括空格、制表符、换行符等),+是量词,它指示前面的模式应该出现一次或多次。
24\/ - 匹配"24/"的字面文本。由于斜杠是一个特殊字符,因此需要使用反斜杠进行转义。
) - 结束非捕获组。
因此,这个正则表达式将匹配类似于"P# 24/""P#   24/""P#    24/"等字符串。

 ([P#)(\s)+(24/)为什么不对
 这个正则表达式是有问题的,因为它包含了不匹配的括号和无效的正则表达式部分。具体来说:

( - 这个左括号没有匹配的右括号。
P# - 匹配"P#"的字面文本。
) - 这个右括号没有匹配的左括号。
(\s)+ - 匹配至少一个连续的空格字符。这个部分是有效的。
24/ - 匹配"24/"的字面文本。
) - 这个右括号也没有匹配的左括号。
因此,这个正则表达式会抛出语法错误,在大多数正则表达式引擎中都无法编译和执行。

如果您想匹配以"P#"开头,接着包含至少一个空格字符,然后包含"24/"的字符串,可以使用以下正则表达式:(?:P#\s+24\/)。这个表达式使用了一个非捕获组来匹配"P#"和"24/"之间的空格字符,并使用反斜杠转义了斜杠字符。

?:非捕获组是什么意思
非捕获组(Non-capturing group)是一个特殊的正则表达式语法,它允许您使用括号来组合多个子模式,但不会创建一个新的捕获组。与普通的捕获组不同,非捕获组不会在匹配时返回对应的匹配结果,而是只用于调整分组结构和限定量词作用范围等情况。

在正则表达式中,使用非捕获组需要在左括号后面添加?:,如(?:pattern)。这样就可以将括号内的模式转换为非捕获组。

例如,假设您想要匹配所有以字母"A"开头,接着跟着任意数量的数字字符,最后以字母"B"结尾的字符串。如果直接使用捕获组,表达式可能是^(A\d+)+B$。但是,由于该表达式中包含了两个捕获组,其中一个重复了多次,因此可能会影响性能并增加代码的可读性。相反,您可以使用非捕获组来简化该表达式:^(?:A\d+)+B$。在这种情况下,只有一个非捕获组被创建,性能更好,并且代码更加清晰易懂。

总之,非捕获组是一种非常有用的正则表达式语法,在某些情况下可以帮助您更好地组织和优化正则表达式。

[P#\s+24\/  直接这样写有什么问题
这个正则表达式 [P#\s+24\/ 缺少右括号,因此无法成功匹配目标字符串。正确的写法是在末尾添加一个右括号:[P#\s+24\/]。

这个正则表达式的意思是匹配包含"P#"、至少一个空格字符和"24/"的任何字符串。其中:

[] 表示一个字符集,用于匹配方括号内的任何一个字符。
P# 匹配字面文本 "P#"。
\s+ 匹配至少一个连续的空白字符(空格、制表符、换行符等)。
24\/ 匹配字面文本 "24/",由于斜线是一个特殊字符,所以需要使用反斜杠进行转义。
总之,如果您想匹配包含"P#"、至少一个空格字符和"24/"的任何字符串,可以使用 [P#\s+24\/] 这个正则表达式

要匹配 [  这个字符呢
如果您想匹配方括号 [,可以使用转义字符 \ 来实现,因为 [ 在正则表达式中是一个特殊的元字符。因此,正确的写法是 \[。

例如,假设您要匹配字符串 "An example of [text] in a sentence." 中的方括号部分,可以使用以下正则表达式:

\[
[\w\s]+
\]
这个正则表达式的意思是:

\[ 匹配字面文本 "[",其中反斜杠用于转义左方括号。
[\w\s]+ 匹配一个或多个单词字符或空格字符。
\] 匹配字面文本 "]",其中反斜杠用于转义右方括号。
这样,该正则表达式将匹配字符串中的方括号部分("[text]"),而不会匹配任何其它包含方括号的部分。

3、记录正则匹配函数

  # 正则表达式匹配所有形式为 "[count]:    36 [command]: on_doRoulette" 的字符串
    pattern = r'\[count\]:\s*(?P<count_str>\d+)\s*\[command\]:\s*(?P<command_str>\w+)'
    for match in re.finditer(pattern, log_data):
        count = int(match.group('count_str'))
        command = match.group('command_str')

        # 如果该 command_str 第一次出现,则在字典中新增一个键值对
        if command not in count_dict:
            count_dict[command] = count
        # 如果该 command_str 已经出现过,则将其 count 值累加到字典中对应的值上
        else:
            count_dict[command] += count
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值