如何将可能包含数字的字符串中的首字母大写

时间:2018-11-01 10:17:00

标签: python string capitalization

我想通读文件并使用Python将字符串中的前几个字母大写,但是某些字符串可能首先包含数字。具体来说,该文件可能如下所示:

"hello world"
"11hello world"
"66645world hello"

我希望这样:

"Hello world"
"11Hello world"
"66645World hello"

我已经尝试了以下方法,但是只有当字母在第一位置时,它才会大写。

with open('input.txt') as input, open("output.txt", "a") as output:
    for line in input:
        output.write(line[0:1].upper()+line[1:-1].lower()+"\n")

有什么建议吗? :-)

15 个答案:

答案 0 :(得分:5)

使用正则表达式:

for line in output:
    m = re.search('[a-zA-Z]', line);
    if m is not None:
        index = m.start()
        output.write(line[0:index] + line[index].upper() + line[index + 1:])

答案 1 :(得分:3)

您可以使用for循环编写函数:

x = "hello world"
y = "11hello world"
z = "66645world hello"

def capper(mystr):
    for idx, i in enumerate(mystr):
        if not i.isdigit():  # or if i.isalpha()
            return ''.join(mystr[:idx] + mystr[idx:].capitalize())
    return mystr

print(list(map(capper, (x, y, z))))

['Hello world', '11Hello world', '66645World hello']

答案 2 :(得分:3)

您可以使用正则表达式查找第一个字母的位置,然后在该索引上使用<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" tools:showIn="navigation_view"> <group android:checkableBehavior="single"> <item android:id="@+id/nav_id" app:actionLayout="@layout/custom_menu_layout" app:showAsAction="always|withText" /> </group> </menu> 以大写该字符。这样的事情应该起作用:

upper()

答案 3 :(得分:1)

也许值得尝试...

>>> s = '11hello World'
>>> for i, c in enumerate(s):
...     if not c.isdigit():
...         break
... 
>>> s[:i] + s[i:].capitalize()
'11Hello world'

答案 4 :(得分:1)

您可以找到第一个字母字符并将其大写,如下所示:

with open("input.txt") as in_file, open("output.txt", "w") as out_file:
    for line in in_file:
        pos = next((i for i, e in enumerate(line) if e.isalpha()), 0)
        line = line[:pos] + line[pos].upper() + line[pos + 1:]
        out_file.write(line)

哪些输出:

Hello world
11Hello world
66645World hello

答案 5 :(得分:1)

怎么样?

import re

text = "1234hello"
index = re.search("[a-zA-Z]", text).start()
text_list = list(text)
text_list[index] = text_list[index].upper()

''.join(text_list)

结果是:1234Hello

答案 6 :(得分:0)

例如,

import re

re_numstart = re.compile(r'^([0-9]*)(.*)')

def capfirst(s):
    ma = re_numstart.match(s)
    return ma.group(1) + ma.group(2).capitalize()

答案 7 :(得分:0)

尝试一下:

with open('input.txt') as input, open("output.txt", "a") as output:
for line in input:
    t_line = ""
    for c in line:
        if c.isalpha():
            t_line += c.capitalize()
            t_line += line[line.index(c)+1:]
            break
        else:
            t_line += c
    output.write(t_line)

执行结果:

Hello world
11Hello world
66645World hello

答案 8 :(得分:0)

可能有一种单行的REGEX方法,但是使用title()也应该可行:

def capitalise_first_letter(s):
    spl = s.split()
    return spl[0].title() + ' ' + ' '.join(spl[1:])

s = ['123hello world',
"hello world",
"11hello world",
"66645world hello"]


for i in s:
    print(capitalise_first_letter(i))

制作:

Hello world
11Hello world
66645World hello

答案 9 :(得分:0)

您可以使用regular expression

import re

line = "66645world hello"

regex = re.compile(r'\D')
tofind = regex.search(line)
pos = line.find(tofind.group(0))+1

line = line[0:pos].upper()+line[pos:-pos].lower()+"\n"

print(line)

输出:66645World

答案 10 :(得分:0)

好的,已经有很多答案了,应该有用。

我发现它们过于复杂或复杂...

这是一个更简单的解决方案:

for s in ("hello world", "11hello world", "66645world hello"):
    first_letter = next(c for c in s if not c.isdigit())
    print(s.replace(first_letter, first_letter.upper(), 1))

答案 11 :(得分:0)

title()方法将大写字符串的第一个字母字符,并忽略其前面的数字。与使用[a-zA-Z]的regex方法相反,它也适用于非ASCII字符。

来自文档:

  

str.title()

     

返回字符串的标题大小写版本,其中单词   以大写字符开头,其余字符为   小写。 [...]该算法使用与语言无关的简单方法   将单词定义为连续字母的组。定义   在许多情况下都可以使用,但这意味着收缩中的撇号   和所有格形成单词边界,这可能不是期望的   结果:

我们可以通过这种方式利用它:

def my_capitalize(s):
    first, rest = s.split(maxsplit=1)
    split_on_quote = first.split("'", maxsplit=1)
    split_on_quote[0] = split_on_quote[0].title()
    first = "'".join(split_on_quote)

    return first + ' ' + rest

一些测试:

tests = ["hello world", "11hello world", "66645world hello", "123ça marche!", "234i'm good"]
for s in tests:
    print(my_capitalize(s))

# Hello world
# 11Hello world
# 66645World hello
# 123Ça marche!  # The non-ASCII ç was turned to uppercase
# 234I'm good    # Words containing a quote are treated properly

答案 12 :(得分:0)

re.sub repl 作为函数:

  

如果repl是一个函数,则每次不重叠时都会调用它   模式的发生。该函数采用单个匹配对象   参数,并返回替换字符串。

def capitalize(m):
    return m.group(1) + m.group(2).upper() + m.group(3)

lines = ["hello world", "11hello world", "66645world hello"]
for line in lines:
    print re.sub(r'(\d*)(\D)(.*)', capitalize, line)

输出:

Hello world
11Hello world
66645World hello

答案 13 :(得分:0)

对字符串使用isdigit()和title():

s = ['123hello world', "hello world", "11hello world", "66645world hello"]
print [each if each[0].isdigit() else each.title() for each in s ]


# ['123hello world', 'Hello World', '11hello world', '66645world hello']                                                                          

答案 14 :(得分:-1)

如果你想转换以字符开头的字符串而不是数字后面的字符大写,你可以试试这段代码:

def solve(s):
    str1 =""
    for i in s.split(' '):
        str1=str1+str(i.capitalize()+' ') #capitalizes the first character of the string
    return str1

>>solve('hello 5g')
>>Hello 5g