正则表达式:使用最后匹配的可选捕获组
Regular Expression : Use last matched optional capture group
我想使用正则表达式完成以下操作:
输入
M1 hello world 1234_5678 ip som lorem 9321_1231 iste natus error sit voluptatem 4313_4351 ratione voluptatem sequi nesciunt 4312_1234
M2 magnam aliquam 4351_3143 sed quia non numquam 3123_1432
输出
M1 hello world 1234 5678
M1 ip som lorem 9321 1231
M1 iste natus error sit voluptatem 4313 4351
M2 magnam aliquam 4351 3143
M2 sed quia non numquam 3123 1432
正则表达式匹配
(M[1|2])?\s+(\D+)(\d{4})_(\d{4})(\n)?
和子
\t\t\t\n
让我接近(见:https://regex101.com/r/tKgCBi/1/)
M1 hello world 1234 5678
ip som lorem 9321 1231
iste natus error sit voluptatem 4313 4351
ratione voluptatem sequi nesciunt 4312 1234
M2 magnam aliquam 4351 3143
sed quia non numquam 3123 1432
如果未进行此(可选)匹配,我如何使用最后一个(可选)匹配的组?我假设它在 (M[1|2]) 时设置 \1 = NULL?失败。
(我正在使用 Python 的 "re" 模块)
您可以使用 2-regex 方法:匹配符合拆分条件的行,然后将这些匹配传递给回调方法以进一步处理它们:
import re
s = '''M1 hello world 1234_5678 ip som lorem 9321_1231 iste natus error sit voluptatem 4313_4351 ratione voluptatem sequi nesciunt 4312_1234
M2 magnam aliquam 4351_3143 sed quia non numquam 3123_1432'''
def repl(m):
return re.sub(r'\s+(\D+)(\d{4})_(\d{4})', '{}\t\1\t\2\t\3\n'.format(m.group(1)), m.group(2))
whole_line_pattern = r'(?m)^(M[12])?((?:\s+\D+\d{4}_\d{4})+)$[\n\r]*'
res = re.sub(whole_line_pattern, repl, s)
print(res)
模式 1:
(?m)^
- 匹配行首
(M[12])?
- 第 1 组匹配 M1
或 M2
((?:\s+\D+\d{4}_\d{4})+)
- 1 个或多个序列:
\s+
- 1+ 个空格
\D+
- 1+ 个非数字字符
\d{4}_\d{4}
- 4 位数字,_
,4 位数字
$[\n\r]*
- 带有 0+ 个换行字符的行尾
每个匹配项都使用 repl
方法处理。正则表达式替换发现
\s+
- 1+ 个空格
(\D+)
- 第 1 组:一个或多个非数字字符
(\d{4})
- 第 2 组:四位字符
_
- _
符号
(\d{4})
- 第 2 组:四位字符
匹配替换为M1
或M2
(m.group(1)
),\1
等是对插入非数字的捕获组的反向引用用制表符括起来的块和 4 位数字块。
我想使用正则表达式完成以下操作:
输入
M1 hello world 1234_5678 ip som lorem 9321_1231 iste natus error sit voluptatem 4313_4351 ratione voluptatem sequi nesciunt 4312_1234
M2 magnam aliquam 4351_3143 sed quia non numquam 3123_1432
输出
M1 hello world 1234 5678
M1 ip som lorem 9321 1231
M1 iste natus error sit voluptatem 4313 4351
M2 magnam aliquam 4351 3143
M2 sed quia non numquam 3123 1432
正则表达式匹配
(M[1|2])?\s+(\D+)(\d{4})_(\d{4})(\n)?
和子
\t\t\t\n
让我接近(见:https://regex101.com/r/tKgCBi/1/)
M1 hello world 1234 5678
ip som lorem 9321 1231
iste natus error sit voluptatem 4313 4351
ratione voluptatem sequi nesciunt 4312 1234
M2 magnam aliquam 4351 3143
sed quia non numquam 3123 1432
如果未进行此(可选)匹配,我如何使用最后一个(可选)匹配的组?我假设它在 (M[1|2]) 时设置 \1 = NULL?失败。
(我正在使用 Python 的 "re" 模块)
您可以使用 2-regex 方法:匹配符合拆分条件的行,然后将这些匹配传递给回调方法以进一步处理它们:
import re
s = '''M1 hello world 1234_5678 ip som lorem 9321_1231 iste natus error sit voluptatem 4313_4351 ratione voluptatem sequi nesciunt 4312_1234
M2 magnam aliquam 4351_3143 sed quia non numquam 3123_1432'''
def repl(m):
return re.sub(r'\s+(\D+)(\d{4})_(\d{4})', '{}\t\1\t\2\t\3\n'.format(m.group(1)), m.group(2))
whole_line_pattern = r'(?m)^(M[12])?((?:\s+\D+\d{4}_\d{4})+)$[\n\r]*'
res = re.sub(whole_line_pattern, repl, s)
print(res)
模式 1:
(?m)^
- 匹配行首(M[12])?
- 第 1 组匹配M1
或M2
((?:\s+\D+\d{4}_\d{4})+)
- 1 个或多个序列:\s+
- 1+ 个空格\D+
- 1+ 个非数字字符\d{4}_\d{4}
- 4 位数字,_
,4 位数字
$[\n\r]*
- 带有 0+ 个换行字符的行尾
每个匹配项都使用 repl
方法处理。正则表达式替换发现
\s+
- 1+ 个空格(\D+)
- 第 1 组:一个或多个非数字字符(\d{4})
- 第 2 组:四位字符_
-_
符号(\d{4})
- 第 2 组:四位字符
匹配替换为M1
或M2
(m.group(1)
),\1
等是对插入非数字的捕获组的反向引用用制表符括起来的块和 4 位数字块。