python和字符串提取

2024-09-27 20:17:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有很多这样的台词:

13480 AAA BBB CCC

我想用python将它们转换成类似于:

^{pr2}$

知道“AAA BBB CCC”是一个城镇,所以它可以是“AAA BBB CCC”、“AAA BBB”、“AAA-BBB-CCC”、“AAA”、“L'AAA”、“D'AAA BBB”、“D'AAA..”。好吧,电话号码后面的最后一个是镇名。在

所以一个大文件包含以下行:

06260 Puget Théniers
06620 Bar sur Loup (Le)
06640 SAINT JEANNET
06640 Saint Jeannet
06660 AURON
06660 SAINT ETIENNE DE TINEE
06660 Saint Etienne de Tinée
06670 Levens
06710 Touët sur Var
06750 ANDON
06750 Thorenc

最终会像

SOUNDEX("Puget Théniers") AND CP="06260"
SOUNDEX("Bar sur Loup (Le)") AND CP="06620"
SOUNDEX("SAINT JEANNET") AND CP="06640"
SOUNDEX("Saint Jeannet") AND CP="06640"
SOUNDEX("AURON") AND CP="06660"
SOUNDEX("SAINT ETIENNE DE TINEE") AND CP="06660"
SOUNDEX("Saint Etienne de Tinée") AND CP="06660"
SOUNDEX("Levens") AND CP="06670"
SOUNDEX("Touët sur Var") AND CP="06710"
SOUNDEX("ANDON") AND CP="06750"
SOUNDEX("Thorenc") AND CP="06750"

开始时最好/最干净的方法是什么?在

我知道我可以在bashshell中使用正则表达式来实现这一点,但我已经用python做了一个大型解析器,可以输出这样的行。所以我想用Python完成所有这些,这就是为什么我要寻找一个干净的代码和一些解释,因为我将来可能会有很多这样的“过滤器”要做。在

[update]13480应该始终是数字,如果不是,则应该引发异常。在


Tags: andlebarcpbbbcccsoundexth
3条回答

试试这个(更复杂):

import re
str = "13480 D'AAA-BBB CCC..."
result = re.search("([\d]+)\s([\w\s\x27\x2E\x2C\x2D]+)",str)

print(result.group(1)) # will print "13480"
print(result.group(2)) # will print "D'AAA-BBB CCC..."

超级简单的解决方案:

^{pr2}$

现在您必须使用组(1)和组(2)的结果或结果[0]和结果[1]来创建SQL查询。但我建议您使用参数化查询,而不是简单的字符串操作(以避免SQL注入)。在

'SELECT XX FROM YY WHERE SOUNDEX("{1} {2} {3}")=FIELD1 AND CP="{0}"'\
    .format(*'13480 AAA BBB CCC'.split())

这一行程序就可以了,您还可以使用一些regular expression。在

但这绝对不是你想用的。正如Martijn所评论的那样,您不应该手动构建SQL表达式。在SQL基MySQLdb或通用sqlalchemy周围使用一个包装器(最终将使用后者)

使用sqlalchemy你会得到这样的结果:

^{pr2}$

(所有这些都是在你写好剧本的前提下进行的。如果您编写了一个一次性代码来处理数据库,那么可以使用split、RegEx甚至VIM脚本)

您可以简单地在第一个空格上拆分这些行:

for line in inputfile:
    code, town = line.strip().split(None, 1)

现在您可以进一步处理这些信息。如果您想使用它来查询数据库,我会生成SQL查询文本。而是使用SQL参数:

^{pr2}$

这有几个优点:

  1. 您不必担心如何正确地转义参数。这在防止SQL注入攻击时非常重要,而且在处理来自输入数据可能包含SQL特定特殊字符的文件中的任意数据时也是如此。在
  2. 数据库有机会准备语句,从而创建一个可供将来查询重用的查询计划。如果你做了很多这样的查询,那会有很大的不同。在

相关问题 更多 >

    热门问题