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