Python 尝试根据大小写将字符串解析为两个独立的字符串

Python 尝试根据大小写将字符串解析为两个独立的字符串,python,html,string,uppercase,lowercase,Python,Html,String,Uppercase,Lowercase,我目前正在开发一个python机器人,它从HTML页面上的元块检索信息。我得到了元块的内容,现在我一直在尝试将其解析为两个不同的字符串 内容的一个例子是: Lowercase Words WITH UPPERCASE CONTAINING 2 AND ALSO ', AND MANY MORE CHARACTERS 到目前为止,我已经: lowercase = ' '.join(w for w in content.split() if (not w.isupper()) and (not w

我目前正在开发一个python机器人,它从HTML页面上的元块检索信息。我得到了元块的内容,现在我一直在尝试将其解析为两个不同的字符串

内容的一个例子是:

Lowercase Words WITH UPPERCASE CONTAINING 2 AND ALSO ', AND MANY MORE CHARACTERS
到目前为止,我已经:

lowercase = ' '.join(w for w in content.split() if (not w.isupper()) and (not w.isdigit()))
uppercase = ' '.join(w for w in content.split() if (w.isupper() or w.isdigit()))
其中大写字符串意味着包含所有不是单词“小写”或“单词”的内容

在这类问题上,我一直找不到太多的帮助,我想知道是否有人知道有什么诡计或解决办法?谢谢诸如此类的事

>>> from string import punctuation as punc
def ispunc(strs):
    return all(x in punc for x in strs)
... 
>>> strs = "Lowercase Words WITH UPPERCASE CONTAINING 2 AND ALSO ', AND MANY MORE CHARACTERS"
>>> ' '.join(w for w in strs.split() if (w.isupper() or w.isdigit() or ispunc(w)))           
"WITH UPPERCASE CONTAINING 2 AND ALSO ', AND MANY MORE CHARACTERS"

>>> ' '.join(w for w in strs.split() if (not w.isupper()) and (not w.isdigit() and not ispunc(w)))           
'Lowercase Words'
>>> 
为什么不使用:

这将匹配以任意数量的单词开头的单行字符串,每个单词必须至少包含一个小写字母(
a-z
)。注意,驼峰大小写也被识别为小写字符串(例如
“LowerCase”
)。然后,第二部分将匹配字符串的其余部分,该部分不得包含任何小写字母

现在让我们试着理解regexp:

  • 我们想匹配小写字母,所以我们写:
    [a-z]+

    但这将只匹配完全由小写字母组成的单词-我们还想允许其他字符,如果单词至少包含一个小写字符,则将其匹配为小写<代码>[^\s]将匹配任何非空白字符(字边界)。我们这样组合这两种模式:
    [^\s]*[a-z]+[^\s]*

    这匹配任意数量的非空白字符(甚至零),后跟小写字符,然后再跟任意序列的非空白字符。因此,这基本上意味着,我们匹配任何不包含空格和至少一个小写字母的序列。
    现在我们用空格分隔这些单词的序列:
    ([^\s]*[a-z]+[^\s]*\s+
  • 匹配大写部分非常简单,因为我们只需要匹配不是小写字符的所有内容(包括空格):
    [^a-z]+
  • 为了使两种模式的匹配可以通过组获得,我们再次将它们用大括号括起来:
    小写:
    (([^\s]*[a-z]+[^\s]*\s+)

    大写:
    ([^a-z]+)


    也许您需要进一步调整模式,以满足您的需要,但我相信这应该是一个很好的起点…

    非常感谢您,亚历山大!这篇文章做得很好,有着令人惊讶的简单解决方案和精美的解释。正是我想要的。
    import re
    
    s = "Lowercase Words WITH UPPERCASE CONTAINING 2 AND ALSO ', AND MANY MORE CHARACTERS"
    match = re.match(r"(([^\s]*[a-z]+[^\s]*\s+)+)([^a-z]+)", s)
    if match:
        lowercase = match.group(1)
        uppercase = match.group(3)