在Python 3中通过前瞻推断年龄

时间:2017-02-24 15:51:13

标签: python regex lookahead

我有一堆推文和各种元数据,我想分析它们用于社会语言学目的。为了做到这一点,我试图通过他们在生物中提供的信息来推断用户的年龄。 为此,我使用正则表达式来匹配用户生物中的一些重复模式,比如用户提到一个数字,然后是“岁月”的各种拼写,如:

“约翰,30岁,工程师。”

然而,我也想检查“岁月”之后的情况,因为很多人都提到了孩子的年龄,我不希望这与用户的年龄错误地联系在一起,如:

“约翰,12岁小孩的父亲,工程师”

因此,应忽略上述情况,以便我只能保留可以推断出有效年龄的用户。

我的程序如下:

import csv
import re

with open("test_corpus.csv") as corpus:
    corpus_read = csv.reader(corpus, delimiter=",")
    for row in corpus_read:
        if re.findall(r"\d{2}\s?(?=years old\s?|yo\s?|yr old\s?|y o\s?|yrs old\s?|year old\s?(?!son|daughter|kid|child))",row[5].lower()):
            age = re.findall(r"\d{2}\s?",row[5].lower())
            for i in age:
                print(i)

该程序似乎在某些情况下有效,但在我创建的小测试文件中试用它,它错误地匹配字符串“我有一个12岁的儿子”中提到的年龄,并返回12作为匹配的年龄,我不想要它。我猜这在程序中的某些方面与括号或分隔符有关,但是我花了几个小时就在它上面,我在论坛上找不到任何有用的东西,所以任何帮助都会受到赞赏。

因此,实际的问题是:根据我已有的程序,如何使程序不识别“John,12岁小孩的父亲,工程师”中的12作为用户的年龄?

我在编程方面有些新意,如果我忘记提及重要的事情,请道歉,如果您需要更多详细信息,请随时告诉我。

提前致谢!

1 个答案:

答案 0 :(得分:0)

好的,经过几天调整程序,最重要的是,四处询问,我已经能够解决问题了!我无法给出详细的解释,因为我不确定自己完全理解它,但问题似乎是代码中空格的位置。但是,如果有人有技术和适当的公式解释,请随时这样做。

无论如何,解决方案是:

import csv 
import re

with open("test_bio.csv") as corpus:
corpus_read = csv.reader(corpus, delimiter=",")
for row in corpus_read:
    if re.search(r"\d{2}\s?(?=(?:years old|yo|yr old|y o|yrs old|year old)(?!\s?son|\s?daughter|\s?kid|\s?child))" ,row[5].lower()):
        age2 = re.findall(r"\d{2}\s?",row[5].lower())
        for z in age2:
            print(z)

再次感谢您的帮助!