我正在编写一个python程序来解析txt文件中的一些用户数据。 文本文件中的一行将包含用户的高度。 我已经指定了用户希望遵循的订单,如
文件的第一行应包含名称,下一行,出生日期, 第3行,身高等。
我还向用户提供了一个样本文件,如下所示
姓名:名字姓氏
DOB:16.04.2000
年龄:16岁
高度:5英尺9英寸
当我阅读文件时,我查看了每一行,并使用'来分割它:'作为分隔符。
第一个字段是我的列名,例如name,dob,age,height。
在某些情况下,用户会忘记':'在姓名或DOB之后,他们只会发送如下数据:
我决定使用的逻辑是:
身高的逻辑是这样的:
if any(heightword in file_line.upper() for heightword in ['FT', 'HEIGHT', 'FEET', 'INCH', 'CM'])
此if
条件会查找与高度相关的字词。
一旦我确定文件中的行包含高度,我希望能够在将其写入数据库之前将该信息转换为英寸。
请有人帮我解决如何将以下数据转换为英寸的问题。
我知道,因为我正在尝试迎合各种用户输入。这份清单并非详尽无遗;我试图用这些作为例子来理解,然后我会在发现新模式时不断添加代码。
答案 0 :(得分:5)
Keyword
,Optional
,OneOrMore
等)和算术运算符('+'
为序列组成您的解析器,{{1}对于替代品等),将较小的解析器组装成较大的解析器。这是一个由你的例子中的位构建的解析器(也支持'和',用于英尺和英寸,以及小数英尺和英寸值)。(此示例使用最新版本的pyparsing,版本2.1.4):
'|'
打印:
samples = """\
Height 5 feet 9 inch
5 feet 9 inch
5ft 9 in
5feet 9inches
5'-9-1/2"
5' 9-1/2"
5' 9 1/2"
6'
3/4"
3ft-6-1/4 in
"""
from pyparsing import CaselessKeyword, pyparsing_common, Optional
CK = CaselessKeyword
feet_units = CK("feet") | CK("ft") | "'"
inch_units = CK("inches") | CK("inch") | CK("in") | '"'
# pyparsing_common.number will parse an integer or real, and convert to float
integer = pyparsing_common.number
fraction = integer + '/' + integer
fraction.addParseAction(lambda t: t[0]/t[-1])
qty = fraction | (integer + Optional(fraction)).addParseAction(lambda t:sum(t))
# define whole Height feet-inches expression
HEIGHT = CK("height") | CK("ht")
inch_qty = qty("inches")
feet_qty = qty("feet")
height_parser = Optional(HEIGHT) + (inch_qty + inch_units |
feet_qty + feet_units + Optional(inch_qty + inch_units))
# use parse-time callback to convert feet-and-inches to inches
height_parser.addParseAction(lambda t: t.get("feet", 0.0)*12 + t.get("inches", 0.0))
height_parser.ignore("-")
height_parser.runTests(samples)
# how to use the parser in normal code
height_value = height_parser.parseString(samples.splitlines()[0])[0]
print(height_value, type(height_value))
答案 1 :(得分:1)
在JavaScript中,有一个名为“计算访问”的操作,完成为SDL_RenderDrawPoint
,其中object[key]
属性读取是通过给定表达式的结果确定的,作为普通{的替代。 {1}}运算符。就个人而言,我主要用它来迭代和读取连字符和东西的属性,但它也可以用来从输入字符串中获取相关的想要结果。
经过整整一个下午的谷歌搜索并弄清楚Python语法等等,我能够编写一个简短的程序来实现这一目标。
object
您可能希望限制可用的关键字,以防止.
过大。
答案 2 :(得分:0)
我在python 3.6的第一个注释中试用了Stephen的代码,不得不对其进行调整以使其对我有用:
import re
h = 0
input = '5 feet 9 inches'
r = re.compile(r'(\d)\s*(\w+)\b')
measures ={'in':1,'inches':1,'inch':1,'foot':12,'feet':12,'ft':12,'cm':0.3937,'centimeter':0.3937,'centimeters':0.3937}
def incr(m):
global h
h+=int(m.group(1))*measures[m.group(2)]
return ''
re.sub(r, incr, input)
print(h)