如何在python中多次解析字符串?
我有一个自定义脚本,我想用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" 在尝试这样做的过程中,我所能做的就是提取标记的位,但是我想不出一种方法来保存未标记的数据!当我提取其他部分时,它总是丢失! 这是我用来提取
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==脑力杂耍/杂技是-英语是吞咽这些外来词的好语言。