用多个可能的分隔符拆分字符串
Splitting a string by multiple possible delimiters
我想将 str
解析为 float
值的列表,但是我想灵活处理分隔符。具体来说,我希望能够使用其中任何一个
s = '3.14; 42.2' # delimiter is '; '
s = '3.14;42.2' # delimiter is ';'
s = '3.14, 42.2' # delimiter is ', '
s = '3.14,42.2' # delimiter is ','
s = '3.14 42.2' # delimiter is ' '
我考虑过删除所有空格,但这会禁用最后一个版本;我通过执行 re.split('[;, ]', s)
尝试了 re.split()
-函数,它可以使用单个字符作为分隔符,但否则会失败。
不过我可以
s.replace('; ', ';').replace(', ', ';').replace(',', ';').replace(' ', ';')
s.split(';')
这有效,但似乎不是一个好的做法或有用的 - 特别是如果我将来添加更多的分隔符。执行此操作的好方法是什么?
可以用re.split拆分([ ]
是一个space,中括号只是为了显示)
[;,] ?|[ ]
模式匹配
[;,] ?
匹配 ;
或 ,
后跟可选的 space
|
或
[ ]
匹配单个space
使用环视的更严格的模式可能是使用环视断言左侧的数字。
(?<=\d)(?:[;,] ?| )(?=\d)
模式匹配:
(?<=\d)
正后视,向左断言一个数字
(?:
交替的非捕获组
[;,] ?
匹配 ;
或 ,
后跟可选的 space
|
或
匹配一个space
)
关闭非捕获组
(?=\d)
正面前瞻,向右断言一个数字
示例代码
import re
strings = [
"3.14; 42.2",
"3.14;42.2",
"3.14, 42.2",
"3.14,42.2",
"3.14 42.2"
]
for s in strings:
print(re.split(r"[;,] ?| ", s))
输出
['3.14', '42.2']
['3.14', '42.2']
['3.14', '42.2']
['3.14', '42.2']
['3.14', '42.2']
我想你可以这样解释最后 space(s) 个:
re.split(r'[;,]\s*', s)
此处\s*
将捕获分隔符后的spaces,如果有的话。
也可以这样:
res = re.split('; |;|,|, | ', data)
见https://www.geeksforgeeks.org/python-split-multiple-characters-from-string/
假设您提前知道输入的分隔符,您可以编写一个函数,将分隔符作为参数,替换为 space,并将其拆分:
def split_on_delim(strng, delim):
return strng.replace(delim, ' ').split()
例如:
>>> s = '3.14; 42.2'
>>> split_on_delim(s, '; ')
['3.14', '42.2']
我想将 str
解析为 float
值的列表,但是我想灵活处理分隔符。具体来说,我希望能够使用其中任何一个
s = '3.14; 42.2' # delimiter is '; '
s = '3.14;42.2' # delimiter is ';'
s = '3.14, 42.2' # delimiter is ', '
s = '3.14,42.2' # delimiter is ','
s = '3.14 42.2' # delimiter is ' '
我考虑过删除所有空格,但这会禁用最后一个版本;我通过执行 re.split('[;, ]', s)
尝试了 re.split()
-函数,它可以使用单个字符作为分隔符,但否则会失败。
不过我可以
s.replace('; ', ';').replace(', ', ';').replace(',', ';').replace(' ', ';')
s.split(';')
这有效,但似乎不是一个好的做法或有用的 - 特别是如果我将来添加更多的分隔符。执行此操作的好方法是什么?
可以用re.split拆分([ ]
是一个space,中括号只是为了显示)
[;,] ?|[ ]
模式匹配
[;,] ?
匹配;
或,
后跟可选的 space|
或[ ]
匹配单个space
使用环视的更严格的模式可能是使用环视断言左侧的数字。
(?<=\d)(?:[;,] ?| )(?=\d)
模式匹配:
(?<=\d)
正后视,向左断言一个数字(?:
交替的非捕获组[;,] ?
匹配;
或,
后跟可选的 space|
或
)
关闭非捕获组(?=\d)
正面前瞻,向右断言一个数字
示例代码
import re
strings = [
"3.14; 42.2",
"3.14;42.2",
"3.14, 42.2",
"3.14,42.2",
"3.14 42.2"
]
for s in strings:
print(re.split(r"[;,] ?| ", s))
输出
['3.14', '42.2']
['3.14', '42.2']
['3.14', '42.2']
['3.14', '42.2']
['3.14', '42.2']
我想你可以这样解释最后 space(s) 个:
re.split(r'[;,]\s*', s)
此处\s*
将捕获分隔符后的spaces,如果有的话。
也可以这样:
res = re.split('; |;|,|, | ', data)
见https://www.geeksforgeeks.org/python-split-multiple-characters-from-string/
假设您提前知道输入的分隔符,您可以编写一个函数,将分隔符作为参数,替换为 space,并将其拆分:
def split_on_delim(strng, delim):
return strng.replace(delim, ' ').split()
例如:
>>> s = '3.14; 42.2'
>>> split_on_delim(s, '; ')
['3.14', '42.2']