如何在python中多次解析字符串?

如何在python中多次解析字符串?,python,Python,我有一个自定义脚本,我想用python从中提取数据,但我能想到的唯一方法是去掉标记的位,然后留下未标记的位,如本例中的“向上”“向下” string_a = [start]go up[wait time=500]go down[p] string_b = @onclick go up[wait time=500]go down active="False" 在尝试这样做的过程中,我所能做的就是提取标记的位,但是我想不出一种方法来保存未标记的数据!当我提取其他部分时,它总是丢失! 这是我用来提取

我有一个自定义脚本,我想用python从中提取数据,但我能想到的唯一方法是去掉标记的位,然后留下未标记的位,如本例中的“向上”“向下”

string_a = [start]go up[wait time=500]go down[p]
string_b = @onclick go up[wait time=500]go down active="False"
在尝试这样做的过程中,我所能做的就是提取标记的位,但是我想不出一种方法来保存未标记的数据!当我提取其他部分时,它总是丢失! 这是我用来提取它们的函数。为了去除标记,我多次调用它,但我无法选择它们被提取的顺序

class Parsers:

  @staticmethod
  def extract(line, filters='[]'):
    #@retval list
    substring=line[:]
    contents=[]
    for bracket in range(line.count(str(filters[0]))):
      startend =[]
      for f in filters:
        now= substring.find(f)
        startend.append(now)
      contents.append(substring[startend[0]+1:startend[1]])
      substring=substring[startend[1]+1:]
    return contents, substring
顺便说一句,我现在叫它的命令是这样的。我想我应该把订单放回第一位,但我不想再破坏它了

star_string, first = Parsers.extract(string_a, filters='* ')
bracket_string, substring = Parsers.extract(string_a, filters='[]')
at_string, final = Parsers.extract(substring, filters='@ ')

请原谅我的python不好,这都是我自己学的,我还在想办法解决这个问题。

你正在用上面的python字符串方法进行一些强大的Malabarism操作-但是如果你只想提取括号内的内容,并得到字符串的剩余部分,那么使用正则表达式(在python中,是“re”)就更容易了模块)

这只是告诉regexp引擎匹配一个literal
[
,并且无论有什么字符(
*
)直到下面的
]
用于匹配下一个字符),而不是最后一个字符)
findall
调用以字符串列表的形式获取所有此类匹配,而
sub
调用将替换空字符串的所有匹配项

正则表达式的优点在于,它们不像Python那样是自己的子编程语言。检查它们的文档:

不过,一种更简单的方法是逐个字符进行检查,并使用一些变量“知道”字符串中的位置(例如,是否在标记中)-就像我们一次只能查看一个字符时所考虑的问题一样。我将在Python 3.x上编写代码-如果您仍在使用Python 2.x,请在尝试以下操作之前将字符串转换为unicode对象:

def extract(line, filters='[]'):
    substring = ""
    contents = []
    inside_tag = False
    partial_tag = ""
    for char  in line:
        if char == filters[0] and not inside_tag:
            inside_tag = True
        elif char == filters[1] and inside_tag:
            contents.append(partial_tag)
            partial_tag = ""
            inside_tag = False
        elif inside_tag:
            partial_tag += char
        else:
            substring += 1
    if partial_tag:
        print("Warning: unclosed tag '{}' ".format(partial_tag))
    return contents, substring

感觉到不需要复杂的计算每个括号在一行中的位置,等等-你只需要全部得到。

你正在用上面的Python字符串方法做一些强大的Malabarism-但是如果你只想提取括号中的内容,并得到字符串的剩余部分,对于正则表达式(在Python中是“re”模块),这将是一件更容易的事情

这只是告诉regexp引擎匹配一个literal
[
,并且无论有什么字符(
*
)直到下面的
]
用于匹配下一个字符),而不是最后一个字符)
findall
调用以字符串列表的形式获取所有此类匹配,而
sub
调用将替换空字符串的所有匹配项

正则表达式的优点在于,它们不像Python那样是自己的子编程语言。检查它们的文档:

不过,一种更简单的方法是逐个字符进行检查,并使用一些变量“知道”字符串中的位置(例如,是否在标记中)-就像我们一次只能查看一个字符时所考虑的问题一样。我将在Python 3.x上编写代码-如果您仍在使用Python 2.x,请在尝试以下操作之前将字符串转换为unicode对象:

def extract(line, filters='[]'):
    substring = ""
    contents = []
    inside_tag = False
    partial_tag = ""
    for char  in line:
        if char == filters[0] and not inside_tag:
            inside_tag = True
        elif char == filters[1] and inside_tag:
            contents.append(partial_tag)
            partial_tag = ""
            inside_tag = False
        elif inside_tag:
            partial_tag += char
        else:
            substring += 1
    if partial_tag:
        print("Warning: unclosed tag '{}' ".format(partial_tag))
    return contents, substring

意识到不需要复杂的计算每个括号在一行中的位置,诸如此类-你只需要把它们全部计算出来。

我不确定我是否完全理解这一点-你想得到
[括号中的东西]
其他所有东西
?如果您只是解析平面字符串(括号中没有递归括号),您可以这样做

import re

parse = re.compile(r"\[.*?\]|[^\[]+").findall
然后

正则表达式翻译为“两个方括号之间的所有内容或任何高达但不包括开口方括号的内容”


如果这不是您想要的-您希望
@word
成为一个单独的块吗请显示
string\u a
string\u b
应该解析为什么

我不确定我是否完全理解这一点-您想获得
[括号中的内容]
其他所有内容
?如果您只是解析平面字符串(括号中没有递归括号),您可以这样做

import re

parse = re.compile(r"\[.*?\]|[^\[]+").findall
然后

正则表达式翻译为“两个方括号之间的所有内容或任何高达但不包括开口方括号的内容”


如果这不是您想要的-您希望
@word
成为一个单独的块吗请显示
string\u a
string\u b
应该解析为什么

这是Python,不是Java——不需要创建一个类来创建一个类。如果您只需要一个
extract
函数,只需在modulevel创建该函数-不需要那里的
staticmethod
。这是Python,而不是Java-不需要创建一个类来创建一个类。如果您只需要一个
提取
函数,只需在模块级别创建函数-无需在那里使用
staticmethod
。TIL:malabarismo==脑力杂耍/杂技是-英语是吞咽这些外来词的好语言。TIL:malabarismo==脑力杂耍/杂技是-英语是吞咽这些外来词的好语言。