如何找到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)

Try it online!

输出:

['field1', 'field2', 'field3']
['field1', 'field2:with:embedded:colons', 'field3']

正确忽略引用字段中的冒号,不需要笨拙,hard-to-verify hand-written 正则表达式。