解决文本规范化任务的 Pythonic 方法
Pythonic way to solve a text normalization task
基本上,我有一个 Hive 脚本文件,我需要从中提取所有创建的 table 的名称。例如从内容
...
create table Sales ...
...
create external table Persons ...
...
Sales
和 Persons
应该被提取。为此,我的基本想法是:
- 搜索关键短语
create table
和 create external table
、
- 提取下一个标记,它应该是 table 名称。
但是,输入可能不规范。例如,
- Tab/newline 可以与 space 一起用作标记分隔符
- 令牌之间可以有多个连续的分隔符
- 混合使用大小写字母如
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
基本上,我有一个 Hive 脚本文件,我需要从中提取所有创建的 table 的名称。例如从内容
...
create table Sales ...
...
create external table Persons ...
...
Sales
和 Persons
应该被提取。为此,我的基本想法是:
- 搜索关键短语
create table
和create external table
、 - 提取下一个标记,它应该是 table 名称。
但是,输入可能不规范。例如,
- Tab/newline 可以与 space 一起用作标记分隔符
- 令牌之间可以有多个连续的分隔符
- 混合使用大小写字母如
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