python 通过分隔符分割字符串,仅当它在引号之外时

标签 python csv parsing

我的字符串具有以下格式:

string = 'token1 -token2 +"token 3"'

我想按如下方式提取 token 和字段:

result = [
    'token1',
    '-token2',
    '+token 3'
]

我正在使用 csv 模块,但未能成功获取最后一个标记为 '+"token', '3"'

# for Python 2.x
try: from StringIO import StringIO
# for Python 3.x
except ImportError: from io import StringIO
import csv

f = StringIO('token1 -token2 +"token 3"')

tokens = csv.reader(f, delimiter=' ', doublequote=False, quotechar='"', quoting=csv.QUOTE_NONE)

for t in tokens: print(t)
# > ['token1', '-token2', '+"token', '3"']

最佳答案

我为这个特定案例编写了一个客户拆分器,因为格式太具体了。下面的代码适用于提供的输入。

# for Python 2.x
try: from StringIO import StringIO
# for Python 3.x
except ImportError: from io import StringIO
import csv

f = StringIO('token1 -token2 +"token 3"')

def check_and_split(line):
    tokens = []
    is_quote = False
    token = ''
    for c in line:
        if c == ' ' and (not is_quote):
            is_quote = False
            tokens.append(token)
            token = ''
        elif c == '"':
            is_quote = True
        else:
            token += c
    tokens.append(token)
    return tokens


for line in f:
    tokens = check_and_split(line)
    for t in tokens: 
        print(t)

输出:

token1
-token2
+token 3

关于python 通过分隔符分割字符串,仅当它在引号之外时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56382556/

相关文章:

python - 为什么 `is` 对相同的实例方法和类方法返回 False,但对静态方法返回 True

Python:如何重新启动循环遍历 csv 的 FOR 循环

java - 这将是解析以下日志文​​件的 java 正则表达式

html - 从 NSString 中提取一个 html 标签和属性

python - 无法在 Boost Python 中返回类的实例

Python 测试 "framework"用于测试输入文件及其输出

python - MongoDB 集合到 pandas Dataframe

python - 统一码编码错误 : 'ascii' codec can't encode character u'\u2019' in position 126: ordinal not in range(128)

python - 如何禁用 Python 2.4 CSV 阅读器中的引用?

c - yacc/bison 操作的范围是什么?