解决文本规范化任务的 Pythonic 方法

Pythonic way to solve a text normalization task

基本上,我有一个 Hive 脚本文件,我需要从中提取所有创建的 table 的名称。例如从内容

...
create table Sales ...
...
create external table Persons ...
...

SalesPersons 应该被提取。为此,我的基本想法是:

  1. 搜索关键短语 create tablecreate external table
  2. 提取下一个标记,它应该是 table 名称。

但是,输入可能不规范。例如,

  1. Tab/newline 可以与 space 一起用作标记分隔符
  2. 令牌之间可以有多个连续的分隔符
  3. 混合使用大小写字母如create TABLE

因此,我正在考虑在应用基本算法之前首先将输入规范化为规范形式。然后通过一些努力,我想出了以下

' '.join(input.split()).lower()

作为一个 Python 新手,我想知道这是否是解决问题的 Pythonic 方法,或者它可能从一开始就存在缺陷?有没有一种简单的方法可以以流方式执行此操作,即避免将整个输入一次加载到内存中?

正如一些评论所述,正则表达式是一种简洁而简单的方式来获得你想要的东西。如果您不介意得到小写的结果,这个应该可行:

import re
my_str = """
...
create table Sales ...
create TabLE  
 test
create external table Persons ...
...
"""
pattern = r"table\s+(\w+)\b"
items = re.findall(pattern, my_str.lower())
print items

它捕获 "table " 之后的下一个单词(后跟至少一个空格/换行符)。

要获取 table 姓名的原始大小写:

for x, item in enumerate(items):
    i = my_str.lower().index(item)
    items[x] = my_str[i:i+len(item)]
print items