首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只匹配大写单词的正则表达式(即不用空格分隔)

只匹配大写单词的正则表达式(即不用空格分隔)
EN

Stack Overflow用户
提问于 2022-01-31 22:35:42
回答 2查看 80关注 0票数 0

我有一长串字符串,它们都是随机单词,它们都是大写的,比如'Pomegranate''Yellow Banana'。然而,它们中的一些是粘在一起的,比如:'AppleOrange'。没有特殊的字符或数字。

我需要的是Python上的正则表达式,它分别与'Apple''Orange'匹配,而不是'Pomegranate''Yellow'

不出所料,我对此非常陌生,我只写了r"(?<!\s)([A-Z][a-z]*)".但这仍然与'Yellow''Pomegranate'相匹配。我该怎么做?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-01-31 22:40:51

如果它们都以大写字符和可选小写字符开头,则可以使用查找和替换来匹配这两个变体。

代码语言:javascript
复制
(?<=[a-z])[A-Z][a-z]*|[A-Z][a-z]*(?=[A-Z])

模式匹配:

  • (?<=[a-z])在左边断言a-z
  • [A-Z][a-z]*匹配and和可选字符and
  • |
  • [A-Z][a-z]*匹配and和可选字符and
  • (?=[A-Z])在右边断言A

Regex演示

示例

代码语言:javascript
复制
import re

pattern = r"(?<=[a-z])[A-Z][a-z]*|[A-Z][a-z]*(?=[A-Z])"
s = ("AppleOrange\nPomegranate Yellow Banana")

print(re.findall(pattern, s))

输出

代码语言:javascript
复制
['Apple', 'Orange']

另一种选择可能是通过匹配避免不想要的内容,并使用一个捕获组来保存所需内容,并从结果中删除空条目:

代码语言:javascript
复制
(?<!\S)[A-Z][a-z]*(?!\S)|([A-Z][a-z]*)

Regex演示 x- Python演示

代码语言:javascript
复制
import re

pattern = r"(?<!\S)[A-Z][a-z]*(?!\S)|([A-Z][a-z]*)"
s = ("AppleOrange\nPomegranate Yellow Banana")

print([x for x in re.findall(pattern, s) if x])
票数 1
EN

Stack Overflow用户

发布于 2022-01-31 22:46:50

这项工作:

代码语言:javascript
复制
import re
from collections import deque

pattern = r'([A-Z]{2,}(?=[A-Z]|$)|[A-Z](?=[a-z]|$))'
chunks = deque(re.split(pattern, 'AppleOrange'))

result = []
while len(chunks):
  buf = chunks.popleft()
  if len(buf) == 0:
    continue
  if re.match(r'^[A-Z]$', buf) and len(chunks):
    buf += chunks.popleft()
  result.append(buf)

print(result)

输出:

代码语言:javascript
复制
['Apple', 'Orange']

检查OP 这里

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70933649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档