我正在实现一个简单的 DSL。我有以下输入字符串:
txt = 'Hi, my name is <<name>>. I was born in <<city>>.'
我有以下数据:
{
'name': 'John',
'city': 'Paris',
'more': 'xxx',
'data': 'yyy',
...
}
我需要实现以下功能:
def tokenize(txt):
...
return fmt, vars
我从哪里得到:
fmt = 'Hi, my name is {name}. I was born in {city}.'
vars = ['name', 'city']
即fmt
可以传给str.format()函数,和vars
是检测到的标记的列表(以便我可以在数据中执行查找,这可能比我描述的更复杂,因为它可以拆分为多个命名空间)
之后,处理格式就很简单了:
def expand(fmt, vars, data):
params = get_params(vars, data)
return fmt.format(params)
哪里get_params
正在执行简单的数据查找,并返回如下内容:
params = {
'name': 'John',
'city': 'Paris',
}
我的问题是:
如何实现标记化?知道分隔符是 <<
后,如何检测 token 和>>
?我应该使用正则表达式,还是有更简单的路径?
这类似于 pystache
,甚至.format
本身正在做,但我想要一个轻量级的实现。在此阶段,稳健性并不是很重要。
最佳答案
是的,这是正则表达式的完美目标。找到开始/结束引号,用大括号替换它们,并将符号名称提取到列表中。您对法律符号有详细的描述吗?您需要进行如下搜索:
/\<\<([a-zA-Z]+[a-zA-Z0-9_]*)\>\>/
对于经典变量名称(请注意,这不包括前导下划线)。您对正则表达式足够熟悉吗?可以从这里获取它吗?
关于python - 识别字符串中的符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38064044/