如何找到Python中不在引号中的某些字符的索引?
How to find the indexes of certain character not in quotes in Python?
我最终想按某个字符拆分字符串。我尝试了正则表达式,但它开始转义 \
,所以我想用另一种方法避免这种情况(所有试图取消转义字符串的尝试都失败了)。所以,我想得到一个字符 char
在不在引号内的字符串中的所有位置,所以我可以相应地将它们分开。
例如,给定相位 hello-world:la\test
,如果 char
是 :
,我想返回 11
,因为那是唯一的 :
在字符串中,它在第 11 个索引中。但是,re
确实拆分了它,但我得到 ['hello-world
,lat\test']
.
EDIT
:
@BoarGules 让我意识到 re
实际上并没有改变任何东西,但这只是 Python 显示斜杠的方式。
这是一个有效的函数:
def split_by_char(string,char=':'):
PATTERN = re.compile(rf'''((?:[^\{char}"']|"[^"]*"|'[^']*')+)''')
return [string[m.span()[0]:m.span()[1]] for m in PATTERN.finditer(string)]
string = 'hello-world:la\test'
char = ':'
print(string.find(char))
版画
11
char_index = string.find(char)
string[:char_index]
Returns
'hello-world'
string[char_index+1:]
Returns
'la\test'
您可能遇到的情况的解决方案(您是 hand-rolling 解析器的 pseudo-CSV 格式;如果您没有遇到这种情况,人们仍然可能遇到这种情况稍后找到这个问题):
只需使用the csv
module。
import csv
import io
test_strings = ['field1:field2:field3', 'field1:"field2:with:embedded:colons":field3']
for s in test_strings:
for row in csv.reader(io.StringIO(s), delimiter=':'):
print(row)
输出:
['field1', 'field2', 'field3']
['field1', 'field2:with:embedded:colons', 'field3']
正确忽略引用字段中的冒号,不需要笨拙,hard-to-verify hand-written 正则表达式。
我最终想按某个字符拆分字符串。我尝试了正则表达式,但它开始转义 \
,所以我想用另一种方法避免这种情况(所有试图取消转义字符串的尝试都失败了)。所以,我想得到一个字符 char
在不在引号内的字符串中的所有位置,所以我可以相应地将它们分开。
例如,给定相位 hello-world:la\test
,如果 char
是 :
,我想返回 11
,因为那是唯一的 :
在字符串中,它在第 11 个索引中。但是,re
确实拆分了它,但我得到 ['hello-world
,lat\test']
.
EDIT
:
@BoarGules 让我意识到 re
实际上并没有改变任何东西,但这只是 Python 显示斜杠的方式。
这是一个有效的函数:
def split_by_char(string,char=':'):
PATTERN = re.compile(rf'''((?:[^\{char}"']|"[^"]*"|'[^']*')+)''')
return [string[m.span()[0]:m.span()[1]] for m in PATTERN.finditer(string)]
string = 'hello-world:la\test'
char = ':'
print(string.find(char))
版画
11
char_index = string.find(char)
string[:char_index]
Returns
'hello-world'
string[char_index+1:]
Returns
'la\test'
您可能遇到的情况的解决方案(您是 hand-rolling 解析器的 pseudo-CSV 格式;如果您没有遇到这种情况,人们仍然可能遇到这种情况稍后找到这个问题):
只需使用the csv
module。
import csv
import io
test_strings = ['field1:field2:field3', 'field1:"field2:with:embedded:colons":field3']
for s in test_strings:
for row in csv.reader(io.StringIO(s), delimiter=':'):
print(row)
输出:
['field1', 'field2', 'field3']
['field1', 'field2:with:embedded:colons', 'field3']
正确忽略引用字段中的冒号,不需要笨拙,hard-to-verify hand-written 正则表达式。