我必须写一个正则表达式条件,其中A标记只包含字母(即a-z
或A-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)
答案 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个部分:
\b(?![-_])
表示如果在单词边界字符(即\b
后面有短划线或下划线)之后不匹配。在这种情况下,将单词边界视为连续的单词字符块的边缘;单词字符是a-z,A-Z或下划线(_
)。在这种情况下,这可能是一个空间甚至是破折号。
(?<![-_])[\w\-]+?
表示不要&#39;吨匹配如果到的字字符和短划线的连续块的右侧(换句话说,我们的令牌的定义)为破折号或下划线。是的,你需要彼此相邻的前瞻断言和后瞻断言,否则[\w\-]+?
将消耗一个领先的短划线。
[\w\-]+?(?![-_])
表示如果我们定义的令牌是破折号或下划线后不匹配
(?<![-_])\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]
)结束。
|
之后的部分是确保它与单字符标记匹配。