如何在不同时包含关键字的情况下获得Python re模块的完全匹配?

时间:2018-03-24 08:12:03

标签: python regex

在以下示例中:

  

“名词1左右两侧左右摇摆zuǒ-yòuyáobǎivoolillating;不稳定;犹豫主席台左右,红旗迎风飘扬.Shǔxítáizuǒyòu,hóngqíyíngfēngpiāoyáng。红旗飘扬在讲台的两侧.2一个数字]左右八点左右左右一个月左右yīgeyuèzuǒyòu一个月左右身高一米七左右Shēngāoyīmǐqīzuǒyòu身高约1.70米价值十元左右.Giàzhíshíyuánzuǒyòu。值得10元左右.3个人近距离;随后屏幕左右Píngtuǒzuǒyòu命令一个人的服务员清除动词大师;控制;影响左右局势zuǒyòujúshì掌握情况;在控制为人所左右wéinénusǒzuǒyòu由另一个人控制;在另一个人的影响下,他这个人不是别人能左右得了的。他不是一个受到其他人影响的人无论如何;无论如何;无论如何;无论如何;任何情况下左右闲没事,我就陪你走一趟吧.Zuǒyòuxiánzheméishì,wǒjiùpéinǐzǒuyītàngba.Ānyway我现在有空了所以让我和你一起去吧。 “

我想根据名词,形容词,副词等分开字符串......如果它们有多个,也可以根据数字分开。

所以最终的结果应该是:

        noun
         ["left and right sides", "左右摇摆 zuǒ-yòu yáobǎi vacillating; unsteady; hesitant 主席台左右, 红旗迎风飘扬。 Zhǔxítái zuǒyòu, hóngqí yíngfēng piāoyáng. Red flags are fluttering on both sides of the rostrum."]
         ["[after a numeral] about; or so", "八点钟左右 bā diǎn zhōng zuǒyòu around eight o'clock 一个月左右 yī ge yuè zuǒyòu a month or so 身高一米七左右 Shēngāo yī mǐ qī zuǒyòu be about 1.70 metres in height 价值十元左右。 Jiàzhí shí yuán zuǒyòu. It's worth about 10 yuan."]
         ["those in close attendance; retinue", "屏退左右 Píng tuì zuǒyòu order one's attendants to clear out"]
        verb
            ["master; control; influence", "左右局势 zuǒyòu júshì be master of the situation; in control 为人所左右 wéi rén suǒ zuǒyòu controlled by another; fall under another’s influence 他这个人不是别人能左右得了的。 Tā zhège rén bù shì biéren néng zuǒyòu déle de. He is not a man to be influenced by others."]
        adverb
            ["dialect anyway; anyhow; in any case", "左右闲没事, 我就陪你走一趟吧。 Zuǒyòu xiánzhe méishì, wǒ jiù péi nǐ zǒu yī tàng ba. Ānyway I’m free now so let me go with you"]

nounverbadverb应该是键,而值可能是dict。由于noun在这里有三个对象,因此应该有三个不同的结果。

因此,第一步是从nounadjective adverbverb等处获取组件,并将其存储到某些变量中。但在这种情况下,我无法根据特定字符串获得相关结果。例如:

re.findall("(noun|verb|adverb|adjective)", s)

这会返回['noun', 'verb', 'adverb'],因为它只关注完全匹配。

所以我添加.+使其成为re.findall("(noun|verb|adverb|adjective).+", s)并在noun后获得任何单词,但随后它抓住了noun之后的所有字符串,包括verb之后的所有字符串1}}或adverb(并返回['noun'])。

所以我撞墙了。是否可以获得相关部分,但除了关键字匹配之外还能得到完整的结果?

3 个答案:

答案 0 :(得分:2)

这不是正则表达式的工作。你想要匹配的东西太多了。

为字典条目编写正确的语法,就像它是一种编程语言一样,然后根据该语法解析数据。

像这样:

  1. 您的语言关键字为nounverbadverb
  2. 每个引入一个未编号或多个编号的定义。
  3. 编号定义的编号单调增加,所以其他 出现在定义中的数字应视为定义的一部分,而不是开始新的数字。
  4. 作为一名有时候的词典编纂者,我还建议您将dialect等标签(通常从标准词汇表中提取)视为可选关键字,而不是定义的一部分。

答案 1 :(得分:1)

最简单的事情可能是import java.lang.reflect.*; class Test { int turn = 1; boolean checkValueVariable(String variableName, int value) throws Exception { Field[] fields = this.getClass().getDeclaredFields(); for (Field field : fields) { if (field.getName().equals(variableName)) return field.getInt(this) == value; } return false; } public static void main(String... args) { Test test = new Test(); String variableName = "turn"; int variableValue = 1; try { System.out.println(test.checkValueVariable(variableName, variableValue)); } catch (Exception e) { e.printStackTrace(); } } } 首先在词性模式上使用re.split字符串:re.split('(noun|adjective|verb|adverb)', s)。对于提供的输入,这包括开头的空项目,然后其余部分将在词性标签和两者之间的位之间交替,然后您可以进一步处理。

答案 2 :(得分:1)

您可以使用

(?s)(noun|verb|adverb|adjective)(.*?)(?=(?:noun|verb|adverb|adjective|$))

请参阅regex demo

<强>详情

  • (?s) - 内联re.DOTALL等效
  • (noun|verb|adverb|adjective) - 第1组:单词nounverbadverbadjective
  • (.*?) - 第2组:任意0个字符尽可能少,直至(但不包括)第一次出现:
  • (?=(?:noun|verb|adverb|adjective|$)) - nounverbadverbadjective或字符串结尾(因为它是一个积极的前瞻,(?=...) ,匹配的文本不会成为比赛的一部分。)

在Python中,与re.findall一起使用:

re.findall(r'(?s)(noun|verb|adverb|adjective)(.*?)(?=(?:noun|verb|adverb|adjective|$))', s)