2

我目前正在开发一个 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()))

其中大写字符串旨在包含不是“小写”或“单词”的所有内容

我无法在此类问题上找到太多帮助,并且想知道是否有人会知道技巧或解决方法?谢谢

4

2 回答 2

0

为什么不使用正则表达式

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)

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

现在让我们尝试理解正则表达式:

  1. 我们想匹配小写单词,所以我们写:[a-z]+
    但这只会匹配完全由小写字母组成的单词——我们也希望允许其他字符,并且如果单词至少包含一个,则将其匹配为小写小写字符。[^\s]将匹配任何不是空格(单词边界)的字符。我们像这样组合这两种模式:[^\s]*[a-z]+[^\s]*.
    这匹配任意数量的非空白字符(甚至零),后跟小写字符,然后再匹配任意非空白字符序列。所以这基本上意味着,我们匹配任何不包含空格和至少一个小写字母的序列。
    现在我们制作一系列这样的单词,用空格分隔:([^\s]*[a-z]+[^\s]*\s+)+
  2. 匹配大写部分非常简单,因为我们只需要匹配不是小写字符的所有内容(包括空格):[^a-z]+

为了使这两种模式都可以通过组进行匹配,我们再次将它们包裹在大括号中:
小写:(([^\s]*[a-z]+[^\s]*\s+)+)
大写:([^a-z]+)

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

于 2013-06-16T10:13:37.083 回答
0

像这样的东西?

>>> 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'
>>> 
于 2013-06-16T08:19:54.757 回答