我有一个txt文件,其中包含州和大学的名称。我已经使用pandas.read_table()将其读入数据框。然后,我要通过iterrows()进行遍历,在每个项目上我只想获得州和大学。可以通过[edit]后缀检测状态。然后将大学排在其他行中,直到出现下一个状态。这意味着后跟“ [编辑]”的另一个名称。数据框的视图如下所示:
如第0行所示,阿拉巴马州为州。第1至8行的大学属于阿拉巴马州,直到出现第9行(另一州)为止。第10行属于阿拉斯加第9行的州。整个数据帧具有这种结构。我正在尝试清理它并返回具有此结构的另一个数据框:一列包含州和大学的名称,但不包括[]和()之后的部分。然后将如下所示:
阿拉巴马州
奥本
佛罗伦萨
杰克逊维尔
某些记录具有“。”或名称中的空白。我写了以下正则表达式来获取它们,但结果也给了我“编辑”,“奥本大学”等信息。换句话说,它返回的是所有匹配的内容,而不仅仅是第一部分。
代码如下:我已经将txt文件读入一个名为df_university_town的数据帧中。然后,我将正则表达式应用如下:
import re
pattern = re.compile(r'([a-zA-Z]+[\.\s]?[a-zA-Z]+)(\w?)')
for key, item in df_university_town.iteritems():
matches = pattern.finditer(str(item))
for match in matches:
print(match.group(1))
这就是我得到的结果:
如您所见,最终结果中的“编辑”和“奥本大学”是多余的。我使用了不同的方法并尝试了match(),但这也没有帮助。基本上,当我到达“ [”或“(”时,不应继续搜索。我不知道我还需要做什么。感谢您的帮助或建议。
非常感谢您的帮助以及投入的时间。
答案 0 :(得分:2)
如果您需要抓住这些字符之前的所有内容,请使用.str.split
。正则表达式允许在(
或[
之前使用可选的空白字符,因此您以后无需去除它。
df.RegStatName.str.split('(\s?\(|\s?\[)').str[0]
0 Alabama
1 Auburn
2 Florence
3 Alaska
4 Fairbanks
5 Arizona
6 Nothing
7 This
Name: RegStatName, dtype: object
df
RegStatName
0 Alabama[edit]
1 Auburn (Auburn University)[1]
2 Florence (University of NOrth Alabama)
3 Alaska[edit]
4 Fairbanks (University of Alaska Fairbanks)[2]
5 Arizona[edit]
6 Nothing
7 This [something]
答案 1 :(得分:1)
您可以尝试一下:
([^\(\)\[\]\n\r]+)(?![^\[\(]*?[\]\)])
它看起来确实很简单,但是似乎可以与您的样本集一起使用,如您在此处看到的: https://regex101.com/r/jBSeqQ/2
如果您想分别提供大学名称,请在下面的评论中提及:)