或者条件不适用于正则表达式python

时间:2018-03-02 00:48:45

标签: python regex

我必须写一个正则表达式条件,其中A标记只包含字母(即a-zA-Z),"-"(连字符)或"(underscore) "。此外,令牌无法以"-""_"开头或结尾。 我试过但我无法得到那个

text = "this is a breath-taking ambitious movie; test text: abc_dcd abc_ dvr89w, abc-dcd -abc"

tokens=re.findall(r'[\-\_][a-zA-Z]+|[a-zA-Z]+-+_[a-zA-Z]', text) 

3 个答案:

答案 0 :(得分:1)

如果您提供一个开始示例和所需的输出可能会有所帮助。 根据我的理解,这可能会让你开始:

import re
example = ['[Beta-blockers-]', 'Magic!', '19_80', 'Presse medicale']
output = [''.join(re.findall(r'[^\]\[.!][A-z0-9]+[^\]\[.!-]', i)) for i in example]

输出:

['Beta-blockers', 'Magic', '19_80', 'Presse medicale']

答案 1 :(得分:1)

我在你的newtext中假设它实际上只是一串空格分隔的标记,所以这里有一堆负面的后观/前方断言:

import re
s = 'foo _foo_ _foo foo_ 123 _123 _123_ 123_ -foo- -foo foo- 5fOo-bAr3 12-3' 
tokens = re.findall(r'\b(?![-_])(?<![-_])[\w\-]+?(?![-_])(?<![-_])\b', s)
print(tokens)
# ouptut 
# ['foo', '123', '5fOo-bAr3', '12-3']

为了解释发生了什么,基本上有4个部分:

  1. \b(?![-_])表示如果在单词边界字符(即\b后面有短划线或下划线)之后不匹配。在这种情况下,将单词边界视为连续的单词字符块的边缘;单词字符是a-z,A-Z或下划线(_)。在这种情况下,这可能是一个空间甚至是破折号。

  2. (?<![-_])[\w\-]+?表示不要&#39;吨匹配如果到的字字符和短划线的连续块的右侧(换句话说,我们的令牌的定义)为破折号或下划线。是的,你需要彼此相邻的前瞻断言和后瞻断言,否则[\w\-]+?将消耗一个领先的短划线。

  3. [\w\-]+?(?![-_])表示如果我们定义的令牌是破折号或下划线后不匹配

  4. (?<![-_])\b表示不匹配,如果令牌左边缘左侧是短划线或下划线

答案 2 :(得分:0)

你的正则表达式应该是这样的:

[a-zA-Z][a-zA-Z\-\_]*[a-zA-Z]|[a-zA-Z]

这使用|(或)运算符来确保它匹配两件事之一。第一个是[a-zA-Z][a-zA-Z\-\_]*[a-zA-Z]。这可以确保它以允许的起始字符([a-zA-Z])开头。然后它允许任意数量的允许字符([a-zA-Z\-\_]*),然后确保它以允许的结束字符([a-zA-Z])结束。

|之后的部分是确保它与单字符标记匹配。