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

问题描述 投票:0回答:3

我必须编写一个正则表达式条件,其中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) 
python regex
3个回答
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
投票

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

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(?![-_])表示如果在单词边界字符之后,即\bthere是短划线或下划线,则不匹配。在这种情况下,将单词边界视为连续的单词字符块的边缘;单词字符是a-z,A-Z或下划线(_)。在这种情况下,这可能是一个空间甚至是破折号。
  2. (?<![-_])[\w\-]+?表示不匹配,如果在单词字符和破折号的连续块的右边(换句话说,我们对令牌的定义)是破折号或下划线。是的,你需要彼此相邻的前瞻断言和后瞻断言,否则[\w\-]+?将消耗一个领先的破折号。
  3. [\w\-]+?(?![-_])表示如果我们对令牌的定义是短划线或下划线后不匹配
  4. (?<![-_])\b表示不匹配,如果令牌左边缘的左边是短划线或下划线

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])结束。

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

© www.soinside.com 2019 - 2024. All rights reserved.