正则表达式忽略分号

Regex to ignore Semicolon

我在数据框中有一列我想提取键值对。

'AF_ESP=0.00546;AF_EXAC=0.00165;AF_TGP=0.00619'

我想像这样解析键值对

('AF_ESP', '0.00546')
('AF_EXAC', '0.00165')
('AF_TGP', '0.00619')

这是我的正则表达式。

([^=]+)=([^;]+)

这让我明白了:

('AF_ESP', '0.00546')
(';AF_EXAC', '0.00165')
(';AF_TGP', '0.00619')

我该如何调整它,使结果中不包含分号?

您可以使用前面的 semi-colon 或字符串开头:

(?:;|^)([^=]+)=([^;]+)

regex demo详情:

  • (?:;|^) - non-capturing 组匹配 ; 或字符串开头
  • ([^=]+) - 第 1 组:=
  • 以外的一个或多个字符
  • = - 一个 = 字符
  • ([^;]+) - 第 2 组:除 ;.
  • 之外的一个或多个字符

参见 Python demo:

import re
text = "AF_ESP=0.00546;AF_EXAC=0.00165;AF_TGP=0.00619"
print( re.findall(r'(?:;|^)([^=]+)=([^;]+)', text) )
# => [('AF_ESP', '0.00546'), ('AF_EXAC', '0.00165'), ('AF_TGP', '0.00619')]

一个non-regex的解决方案也是可以的:

text = "AF_ESP=0.00546;AF_EXAC=0.00165;AF_TGP=0.00619"
print( [x.split('=') for x in text.split(';')] )
# => [['AF_ESP', '0.00546'], ['AF_EXAC', '0.00165'], ['AF_TGP', '0.00619']]

参见 this Python demo

这也可以用split方法解决:

text = "AF_ESP=0.00546;AF_EXAC=0.00165;AF_TGP=0.00619"
print([tuple(i.split('=')) for i in text.split(';')])

输出:

[('AF_ESP', '0.00546'), ('AF_EXAC', '0.00165'), ('AF_TGP', '0.00619')]

@Wiktor 解决方案的另一种更简单的方法是,步骤如下:

  1. 捕获所有内容,直到 =
  2. 获取 = 但不要捕获它。
  3. 获取 = 之后的所有内容,直到存在可选的 ;

这将转换为以下正则表达式:

在python中:

>>> re.findall(r'([^=]+)=([^;]+);?', "AF_ESP=0.00546;AF_EXAC=0.00165;AF_TGP=0.00619")
[('AF_ESP', '0.00546'), ('AF_EXAC', '0.00165'), ('AF_TGP', '0.00619')]