【问题标题】:Python pattern matching: Not able to understand the reasonPython模式匹配:无法理解原因
【发布时间】:2015-12-29 05:52:00
【问题描述】:

我做错了什么?

Input file data format : 
 Address: data modified         Phone: 7373737373
    Eligibility:                                    Age: 12
                                                    Sex: MALE
           Race:                                         

#Test file
content = open("output.txt","r")

# Output file
fileCSV = open("testCSV.csv","a")

patAddress = re.compile('Address:[\w \W \S \d \D - / + ,  = \s ]{40}')
patAge = re.compile('Age:[0-9 \s]{1,3}')
patSex = re.compile('Sex:[a-z A-Z \s \S]{1,2}')
for value in content:
    address = patAddress.findall(value)
    sex = patSex.findall(value)
    age = patAge.findall(value)
    for p_address in address:
        fileCSV.write(p_address)
    for p_sex in sex:
        fileCSV.write("|"+p_sex)
    for p_age in age:
        fileCSV.write("|"+p_age)
        fileCSV.write("\n")
fileCSV.close();

我希望输出是这样的:

Address : some text| Sex: M|Age: 25 \n in the end

我得到的输出是:

Address : some text|Age: 25 
|Sex: M

这也是我在 Sex 之后得到的确切输出。

谁能告诉我这背后的原因。这是python的第三天,我的意思是我是python的新手。我无法得到打印性别之前的年龄背后的原因

感谢任何帮助。

【问题讨论】:

  • 你能展示你的示例输入吗?
  • 只有我能分享这么多,那个 output.txt 是包含大量数据的文件。我需要将其转换为 csv(仅必填字段)。

标签: python regex python-2.7


【解决方案1】:

您可能应该移动编写输出的代码块:

for p_address in address:
    fileCSV.write(p_address)
for p_sex in sex:
    fileCSV.write("|"+p_sex)
for p_age in age:
    fileCSV.write("|"+p_age)
    fileCSV.write("\n")

走出去

for value in content:

循环。

现在,它会按照在输入中找到的内容打印它们,而不是按照您尝试编写它们的顺序。

---- EDIT ----(在cmets之后,处理多个值)

这里有一些代码:

address_list=[]
sex_list=[]
age_list=[]
for value in content:
    address = patAddress.findall(value)
    address_list.extend(address)
    sex = patSex.findall(value)
    sex_list.extend(sex)
    age = patAge.findall(value)
    age_list.extend(age)

for p_address in address_list:
    fileCSV.write(p_address)
for p_sex in sex_list:
    fileCSV.write("|"+p_sex)
for p_age in age_list:
    fileCSV.write("|"+p_age)

fileCSV.write("\n")
fileCSV.close();

【讨论】:

  • 然后,当您找到地址、性别或年龄时,您应该将它们添加到“for value in content:”循环中的列表中。只有在你打印这些之后。
  • 你能说得清楚一点吗?地址,年龄和性别的数量可能不相等[这是我的观点,我不知道OP的完整数据]?
  • 如果我移出内容,那么如何解析具有包含相同模式的多个值的文件。它需要作为单独的数据进行分解。该文件的 Sex age 和 address 字段出现多次,但每个唯一 ID 出现一次。
  • 您为每个(地址、性别、年龄)创建单独的列表,使用 address_list = []、sex_list = []、age_list=[] 初始化它们,当您运行正则表达式时,执行 address_list。扩展(地址)等等。然后从这些列表中打印。
  • 现在如果文件大小超过 5 GB 怎么办?如果我创建一个变量,那么数组大小是多少?
【解决方案2】:

我得到的输出是:

Address : some text|Age: 25 
|Sex: M

这也是我在 Sex 之后得到的确切输出。

谁能告诉我这背后的原因。

只是因为在循环中

    for p_age in age:
        fileCSV.write("|"+p_age)
        fileCSV.write("\n")

"\n" 写在 每个 "|"+p_age 之后。

代码还有其他问题。我建议:

…
for value in iter(content.readline, ''):
    address = patAddress.search(value)
    if address:
        age = patAge.search(content.readline())
        sex = patSex.search(content.readline())
        fileCSV.write(address.group()+"|"+sex.group()+"|"+age.group()+"\n")
fileCSV.close()

【讨论】:

    猜你喜欢
    • 2022-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    相关资源
    最近更新 更多