python - 识别字符串中的符号

标签 python tokenize

我正在实现一个简单的 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/

相关文章:

python - 根据自定义字典对字符串进行分词

python - 为什么单元测试中的 python 记录器在调用 setLevel 后不起作用

sqlite - 如何停止。在 SQLite FTS4 中被视为分隔符

android - 在 Comma Tokenizer android 中用管道符号替换逗号符号不起作用

Python Pandas NLTK 标记 Pandas 数据帧中的列 : expected string or bytes-like object

C++ 数学分词器/解析器错误

python - 在 PyCharm 中运行程序后显示解释器 (IPython) 时出现问题

python - 如何在 Python JWT 中 token 过期时提取 JWT token 有效负载

python - 类函数不接受 self 。多变的

elasticsearch - 带有 "&"的同义词过滤器在 elasticsearch 中不起作用,建议使用标准分词器