我想通读文件并使用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")
有什么建议吗? :-)
答案 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