Python 在字符串中查找大写首字母缩略词
我试图在字符串中找到大写首字母缩写词。例如,如果输入是“我需要尽快见你,因为YOLO,你知道”应该返回[“尽快”,“YOLO”] 我试图去掉标点符号,然后在字符串中循环,当它是大写字母时,将字母打印出来。这导致了一个无限循环。我想用字符串操作来解决这个问题,所以没有正则表达式 编辑:Python 在字符串中查找大写首字母缩略词,python,string,loops,uppercase,Python,String,Loops,Uppercase,我试图在字符串中找到大写首字母缩写词。例如,如果输入是“我需要尽快见你,因为YOLO,你知道”应该返回[“尽快”,“YOLO”] 我试图去掉标点符号,然后在字符串中循环,当它是大写字母时,将字母打印出来。这导致了一个无限循环。我想用字符串操作来解决这个问题,所以没有正则表达式 编辑: 更改删除标点符号以提高效率 发件人: 致: 在这方面,这应该是可行的: def acronyms(x): ans = [] y = x.split(" ") for i in y:
def acronyms(x):
ans = []
y = x.split(" ")
for i in y:
if i.isupper():
ans += [i]
return ans
isupper()返回
True
,只要没有小写字母,即使有标点符号您的while循环在第一个字符上迭代,但从不中断以转到下一个字符
您还需要过滤掉“I”,因为单个字母通常不会被归类为首字母缩略词
string.isupper()
函数检查整个字符串而不是单个字符,因此我建议您使用它。它看起来是这样的:
def首字母缩略词:
words=s.split()
首字母缩略词=[]
用文字表示:
如果word.isupper()和len(word)>1:
缩略语。附加(单词)
返回首字母缩略词
我想指出几件事。首先,你的程序被挂起了,因为你有一个while True
,而没有一个break
。然后,当您执行n+=1
时,您会使枚举变得毫无意义
for i, x in enumerate(s):
n+=1
这一切都可以很容易地简化,无需枚举
def acronyms(s):
exclude = set(string.punctuation)
s = "".join(ch for ch in s if ch not in exclude)
acro = [x for x in s.split() if x.isupper()]
return acro
输出
['I', 'ASAP', 'YOLO']
不幸的是,我们确实有一个额外的I
,它恰好不是首字母缩写,因此一个修复方法是确保x
在被附加之前从来不是一个字母
acro = [x for x in s.split() if x.isupper() and len(x) != 1]
我强烈推荐使用nltk
,因为它的出色的标记化包,它可以出色地处理边缘情况和标点符号
对于将首字母缩略词定义为以下内容的简化方法:
- 所有字符都按字母顺序排列
- 所有字符都是大写的
以下内容应足够:
从nltk.tokenize导入单词\u tokenize
def get_首字母缩略词(文本):
返回[
word_tokenize(文本)中令牌的令牌
if-token.isupper()
]
在OP代码上构建很好,但是我真的认为使用s.split()
和exclude
对象不是一个好方法。它完成了任务,但还远远没有产生一个强大的团队tokenisation@Matt不是那个家伙,但堆栈溢出不是为Pople编写完整代码的地方。通过给人们完整的答案,他们不会从中学到什么。我尝试实现了这一点,一些答案产生了一个元组而不是字符串,所以我将尝试找到一种方法来修复它
def acronyms(s):
exclude = set(string.punctuation)
s = "".join(ch for ch in s if ch not in exclude)
acro = [x for x in s.split() if x.isupper()]
return acro
['I', 'ASAP', 'YOLO']
acro = [x for x in s.split() if x.isupper() and len(x) != 1]