正则表达式忽略分号
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 解决方案的另一种更简单的方法是,步骤如下:
- 捕获所有内容,直到
=
。
- 获取
=
但不要捕获它。
- 获取
=
之后的所有内容,直到存在可选的 ;
。
这将转换为以下正则表达式:
在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')]
我在数据框中有一列我想提取键值对。
'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 解决方案的另一种更简单的方法是,步骤如下:
- 捕获所有内容,直到
=
。 - 获取
=
但不要捕获它。 - 获取
=
之后的所有内容,直到存在可选的;
。
这将转换为以下正则表达式:
在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')]