我有一长串字符串,它们都是随机单词,它们都是大写的,比如'Pomegranate'和'Yellow Banana'。然而,它们中的一些是粘在一起的,比如:'AppleOrange'。没有特殊的字符或数字。
我需要的是Python上的正则表达式,它分别与'Apple'和'Orange'匹配,而不是'Pomegranate'或'Yellow'。
不出所料,我对此非常陌生,我只写了r"(?<!\s)([A-Z][a-z]*)".但这仍然与'Yellow'和'Pomegranate'相匹配。我该怎么做?
发布于 2022-01-31 22:40:51
如果它们都以大写字符和可选小写字符开头,则可以使用查找和替换来匹配这两个变体。
(?<=[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示例
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))输出
['Apple', 'Orange']另一种选择可能是通过匹配避免不想要的内容,并使用一个捕获组来保存所需内容,并从结果中删除空条目:
(?<!\S)[A-Z][a-z]*(?!\S)|([A-Z][a-z]*)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])发布于 2022-01-31 22:46:50
这项工作:
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)输出:
['Apple', 'Orange']检查OP 这里
https://stackoverflow.com/questions/70933649
复制相似问题