【问题标题】:Tokenize characters except when encapsulated by brackets and keep brackets标记字符,除非用括号封装并保留括号
【发布时间】:2021-10-01 08:16:19
【问题描述】:

我正在解析我的击键数据。它看起来像这样:

> key_data = 'stuff[up][left][return]end'

我想对字符进行标记,但将 [] 包围的修饰符视为单个标记。

> print(key_tokens)
['s','t','u','f','f','[up]','[left]','[return]','e','n','d']

我知道我可以这样做来找到封装的部分:

> key_tokens = re.split(r'([\[\]])', key_data)
> print(key_tokens)
['stuff','[','up',']','[','left',']','[','return',']','end']

我当然也可以这样做来分隔每个字符:

> key_tokens = [c for c in key_data]
> print(key_tokens)
['s','t','u','f','f','[','u','p',']','[','l','e','f','t',']','[','r','e','t','u','r','n',']','e','n','d']

我只是很难把它们放在一起。

编辑:现在我看到一个角落案例,其中左方括号用作文本。不幸的是,它没有被转义或任何东西。

> key_data = 'stuff[but[up][left][return]end'
> key_tokens = re.findall('\[.*?\]|.', key_data)
> print(key_tokens)
['s','t','u','f','f','[but[up]','[left]','[return]','e','n','d']

我想看到的是:

> print(key_tokens)
['s','t','u','f','f','[','b','u','t','[up]','[left]','[return]','e','n','d']

【问题讨论】:

  • key_tokens = re.split(r'([\[\]])', key_data)开头,然后重新组合括号。

标签: python regex nlp


【解决方案1】:

如果您不介意使用re.findall 而不是re.split,您可以先尝试使用\[.*?\] 匹配方括号内任何内容的模式,如果不介意,那么您可以只取一个字符|. 正在做什么,它将匹配 1 长度的任何字符,如果您在示例数据中只有单词字符(即字母),您可以考虑使用 |\w

>>> re.findall('\[.*?\]|.', key_data)

['s', 't', 'u', 'f', 'f', '[up]', '[left]', '[return]', 'e', 'n', 'd']

更新问题: 如果是这种情况,您可以考虑使用正则表达式的替代方法,因为它不太擅长处理这些类型的嵌套,因为值需要来回比较。这是一个非正则表达式的解决方案:

result = []
idx = 0
while True:
    c = key_data[idx]
    if c != '[':
        idx += 1
        result.append(c)  #Append if not [
    else:
        closingIndex = key_data[idx+1:].find(']') # find if ] exist after current [
        if closingIndex == -1:
            #append the rest sub-srting and break since no ] after current [
            result.extend(key_data[idx:])
            break
        else:
            # Check if [ in the  middle, append only c if True
            if '[' in key_data[idx+1:idx+closingIndex+2]:
                result.append(c)
                idx += 1
            else:
                #Extend from [ to the nearest ]
                result.append(key_data[idx:idx+closingIndex+2])
                idx += closingIndex+2
    if idx>=len(key_data): break  #Break loop if idx exceeds maximum value

【讨论】:

  • 这工作除了我找到的角落案例。请参阅对问题的编辑。
猜你喜欢
  • 2017-07-06
  • 2020-03-19
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
  • 2012-10-26
  • 1970-01-01
  • 2020-04-26
  • 1970-01-01
相关资源
最近更新 更多