正则表达式,用于在Python中以空格开头或后跟特殊字符进行拆分

时间:2017-04-18 00:13:29

标签: regex python-3.x

我是Python的新手,我在使用正则表达式时遇到问题我正在使用将外部文件解析为列表中的单个单词。我必须能够正确地插入像#34; don&#t;#34;和连字符,如" x-ray"。

我实际上有两件事没有正常工作:1)我的列表为最后一个元素插入一个空字符串,2)当试图拆分单个引号或连字符(前面或后面跟一个空格)时,它会分裂不管它旁边是什么特殊角色。

我认为你可以在括号中加上字符来表示"然后是这个"但它似乎没有用。

这是我的代码段:

with open(badWords, 'r') as f:
        line = f.read().strip()
        ignoreList = split(r'[(\s\') (\'\s) (\s\-) (\-\s) \. \! \; \: \" \$ \% \& \, \+ \* \< \> \? \/ \[ \] \( \) \d]+', line)

文件的输出(其中&#34; don&#t;&#34;&#34; x-ray&#34;已添加)如下所示:

  

[&#39;四&#39;,&#39;得分&#39;,&#39;和&#39;,&#39;唐&#39;&#39;&#39;,& #39; x&#39;,&#39; ray&#39;,&#39; seven&#39;,&#39; years&#39;,&#39; ago&#39;,&#39;我们的&# 39;,&#39;父亲&#39;,&#39;&#39;&#39;&#39;&#39;&#39;&#39;,&#39;这&#39;,&#39; 39;大陆&#39;,&#39; a&#39;,&#39;新&#39;,&#39;国家&#39;,&#39;构思&#39;,&#39;&#39;&#39; ;,&#39; Liberty&#39;,&#39;,&#39;,&#39;&#39;&#39;&#39;,&#39;命题&#39;,&#39;那个&#39;,&#39;所有&#39;,&#39; men&#39;,&#39;&#39;,&#39;创建&#39;,&#39;平等&#39; ,&#39;&#39;]

我做错了什么?

3 个答案:

答案 0 :(得分:0)

我认为你要求的是如何分割所有单词并正确包含带连字符或撇号的单词。

试试这个正则表达式:[^ \ s。\?!] +

根据需要添加其他标点符号以进行忽略。

示例 - regex101

答案 1 :(得分:0)

从你的问题中不清楚你想要在连字符或撇号旁边有空格的情况下做什么。

假设文字为"Is X-ray a hyper- or a hyponym of scanner, darlin'?

如果您希望结果为["Is", "X-ray", "a", "hyper-", "or", "a", "hyponym", of "scanner", "darlin'"],那么这很简单,因为我们只是将一系列不是字母,连字符或撇号的序列分开:

split(r"[^a-zA-Z-']+", line)

如果您想将结果设为["Is", "X-ray", "a", "hyper", "or", "a", "hyponym", of "scanner", "darlin"],那么它会变得更复杂一些:

split(r"\s+['-]\s*|['-]\s+|[^a-zA-Z-']+", line)

这里我们拆分我们之前拆分的所有东西,但也包括空格序列,后跟连字符或撇号(可能后跟更多空格),或者只是连字符或撇号后跟空格,但前面没有空格(基本上说前面或后面或两者都有空格。)

答案 2 :(得分:0)

我走向了另一个方向,以适应作业的其他要求,并希望分享结果。

另一个要求是将单词加载到字典中并计算出现次数,因此我必须定义一个可以在循环中重用的模式。我匹配至少一个字母,后跟0或1的单引号(用于收缩)或连字符(用于连字符),后跟至少一个字母。

pattern = compile("[a-z]+[-']?[a-z]+", IGNORECASE)
wordCount = {}
with open('Words.txt', 'r') as f:
    for word in f.read().split():
        match = search(pattern, word)
        if match:
            if match.group().lower() not in wordCount:
                wordCount[match.group().lower()] = 1
            else:
                wordCount[match.group().lower()] += 1

可能有更优雅的方式来获得这些结果,但这似乎有效。