Pythonic方式解决文本规范化任务

时间:2018-01-26 02:02:10

标签: python algorithm python-textprocessing

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

...
create table Sales ...
...
create external table Persons ...
...
应提取

SalesPersons。要做到这一点,我的基本想法是:

  1. 搜索关键短语create tablecreate external table
  2. 提取下一个应该是表名的标记。
  3. 但是,输入可能不是规范的。例如,

    1. Tab /换行符可以与空格一起用作标记分隔符
    2. 令牌之间可能有多个连续的分隔符
    3. 混合使用大写和小写字母,如create TABLE
    4. 因此,我正在考虑在应用基本算法之前首先将输入规范化为规范形式。然后经过一番努力,我想出了以下内容

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

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

1 个答案:

答案 0 :(得分:1)

正如一些评论所说,正则表达式是一种简洁明了的方式来获得你想要的东西。如果您不介意获得小写结果,那么这个应该可以工作:

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"之后的下一个单词。 (后面跟着至少一个空格/换行符。)

获取表名的原始案例:

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