Заглавная буква строки в виде бритвы [дубликат]

Вы можете выполнить цикл через серию с функцией apply() и преобразовать каждый список в Series, это автоматически расширит список как серию в направлении столбца:

df[0].apply(pd.Series)

#   0    1   2
#0  8   10  12
#1  7    9  11

Обновить : Чтобы сохранить другие столбцы фрейма данных, вы можете связать результат с столбцами, которые вы хотите сохранить:

pd.concat([df[0].apply(pd.Series), df[1]], axis = 1)

#   0    1   2  1
#0  8   10  12  A
#1  7    9  11  B
138
задан Gilles 14 September 2012 в 18:59
поделиться

17 ответов

TextInfo.ToTitleCase() использует первый символ в каждом знаке строки. Если вам не нужно поддерживать Акроним Uppercasing, тогда вы должны включить ToLower().

string s = "JOHN DOE";
s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());
// Produces "John Doe"

Если CurrentCulture недоступен, используйте:

string s = "JOHN DOE";
s = new System.Globalization.CultureInfo("en-US", false).TextInfo.ToTitleCase(s.ToLower());

См. MSDN Link для подробного описания.

254
ответ дан MikeTeeVee 26 August 2018 в 04:47
поделиться

Надеюсь, это вам поможет.

String fName = "firstname";
String lName = "lastname";
String capitalizedFName = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(fName);
String capitalizedLName = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(lName);
0
ответ дан Arun 26 August 2018 в 04:47
поделиться

ToTitleCase () должен работать для вас.

http://support.microsoft.com/kb/312890

5
ответ дан ckal 26 August 2018 в 04:47
поделиться

Самым прямым вариантом будет использование функции ToTitleCase , доступной в .NET, которая должна заботиться о имени большую часть времени. Как указал edg , есть некоторые имена, для которых это не сработает, но они довольно редки, поэтому, если вы не нацеливаете культуру, где такие имена являются общими, не нужно то, что вам тоже нужно беспокоиться

Однако, если вы не работаете с .NET langauge, это зависит от того, как выглядит вход - если у вас есть два отдельных поля для имени и фамилии, то вы можете просто

firstName = firstName.Substring(0, 1).ToUpper() + firstName.Substring(1).ToLower();
lastName = lastName.Substring(0, 1).ToUpper() + lastName.Substring(1).ToLower();

Однако, если вам предоставлено несколько имен как часть одной и той же строки, вам необходимо знать, как вы получаете информацию, и разделить его соответственно. Поэтому, если вы получаете такое имя, как «John Doe», вы разбиваете строку на основе символа пробела. Если он находится в таком формате, как «Doe, John», вам нужно разбить его на основе запятой. Однако, как только вы разделите его, вы просто примените код, показанный ранее.

4
ответ дан Community 26 August 2018 в 04:47
поделиться

CultureInfo.CurrentCulture.TextInfo.ToTitleCase («мое имя»);

возвращает ~ My Name

Но проблема все еще существует с такими именами, как McFly, как указано ранее.

3
ответ дан David C 26 August 2018 в 04:47
поделиться

Этот класс делает трюк. Вы можете добавить новые префиксы в статический массив строк _prefixes.

public static class StringExtensions
{
        public static string ToProperCase( this string original )
        {
            if( String.IsNullOrEmpty( original ) )
                return original;

            string result = _properNameRx.Replace( original.ToLower( CultureInfo.CurrentCulture ), HandleWord );
            return result;
        }

        public static string WordToProperCase( this string word )
        {
            if( String.IsNullOrEmpty( word ) )
                return word;

            if( word.Length > 1 )
                return Char.ToUpper( word[0], CultureInfo.CurrentCulture ) + word.Substring( 1 );

            return word.ToUpper( CultureInfo.CurrentCulture );
        }

        private static readonly Regex _properNameRx = new Regex( @"\b(\w+)\b" );
        private static readonly string[] _prefixes = {
                                                         "mc"
                                                     };

        private static string HandleWord( Match m )
        {
            string word = m.Groups[1].Value;

            foreach( string prefix in _prefixes )
            {
                if( word.StartsWith( prefix, StringComparison.CurrentCultureIgnoreCase ) )
                    return prefix.WordToProperCase() + word.Substring( prefix.Length ).WordToProperCase();
            }

            return word.WordToProperCase();
        }
}
2
ответ дан Eddie Velasquez 26 August 2018 в 04:47
поделиться

Если вы используете vS2k8, вы можете использовать метод расширения, чтобы добавить его в класс String:

public static string FirstLetterToUpper(this String input)
{
    return input = input.Substring(0, 1).ToUpper() + 
       input.Substring(1, input.Length - 1);
}
1
ответ дан FlySwat 26 August 2018 в 04:47
поделиться

Mc и Mac - обычные префикс фамилии по всей территории США, и есть другие. TextInfo.ToTitleCase не обрабатывает эти случаи и не должен использоваться для этой цели. Вот как я это делаю:

    public static string ToTitleCase(string str)
    {
        string result = str;
        if (!string.IsNullOrEmpty(str))
        {
            var words = str.Split(' ');
            for (int index = 0; index < words.Length; index++)
            {
                var s = words[index];
                if (s.Length > 0)
                {
                    words[index] = s[0].ToString().ToUpper() + s.Substring(1);
                }
            }
            result = string.Join(" ", words);
        }
        return result;
    }
7
ответ дан Jamie Ide 26 August 2018 в 04:47
поделиться

Чтобы обойти некоторые проблемы / проблемы, которые были выделены ben, я бы предложил сначала преобразовать строку в нижний регистр, а затем вызвать метод ToTitleCase. Затем вы можете использовать IndexOf («Mc») или IndexOf («O \») для определения особых случаев, требующих особого внимания.

inputString = inputString.ToLower();
inputString = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(inputString);
int indexOfMc = inputString.IndexOf(" Mc");
if(indexOfMc  > 0)
{
   inputString.Substring(0, indexOfMc + 3) + inputString[indexOfMc + 3].ToString().ToUpper() + inputString.Substring(indexOfMc + 4);
}
0
ответ дан jjclarkson 26 August 2018 в 04:47
поделиться

Как указано edg, вам понадобится более сложный алгоритм для обработки специальных имен (вероятно, поэтому многие места заставляют все в верхнем регистре).

Что-то вроде этого непроверенного c # должно обрабатывать простой случай вы запросили:

public string SentenceCase(string input)
{
    return input(0, 1).ToUpper + input.Substring(1).ToLower;
}
-1
ответ дан Michael Haren 26 August 2018 в 04:47
поделиться
 public static string ConvertToCaptilize(string input)
        {
            if (!string.IsNullOrEmpty(input))
            {
                string[] arrUserInput = input.Split(' ');


                // Initialize a string builder object for the output
                StringBuilder sbOutPut = new StringBuilder();


                // Loop thru each character in the string array
                foreach (string str in arrUserInput)
                {
                    if (!string.IsNullOrEmpty(str))
                    {
                        var charArray = str.ToCharArray();
                        int k = 0;
                        foreach (var cr in charArray)
                        {
                            char c;
                            c = k == 0 ? char.ToUpper(cr) : char.ToLower(cr);
                            sbOutPut.Append(c);
                            k++;
                        }


                    }
                    sbOutPut.Append(" ");
                }
                return sbOutPut.ToString();
            }
            return string.Empty;

        }
0
ответ дан mmushtaq 26 August 2018 в 04:47
поделиться
CultureInfo.CurrentCulture.TextInfo.ToTitleCase("hello world");
116
ответ дан Nathan Baulch 26 August 2018 в 04:47
поделиться

Есть некоторые случаи, которые невозможно обработать CultureInfo.CurrentCulture.TextInfo.ToTitleCase, например: апостроф '.

string input = CultureInfo.CurrentCulture.TextInfo.ToTitleCase("o'reilly, m'grego, d'angelo");
// input = O'reilly, M'grego, D'angelo

Регулярное выражение также может использоваться \b[a-zA-Z] для определения стартового символа слова после границы слова \b, нам нужно просто заменить соответствие его эквивалентом в верхнем регистре с помощью метода Regex.Replace(string input,string pattern,MatchEvaluator evaluator) :

string input = "o'reilly, m'grego, d'angelo";
input = Regex.Replace(input.ToLower(), @"\b[a-zA-Z]", m => m.Value.ToUpper());
// input = O'Reilly, M'Grego, D'Angelo

Регулярное выражение может быть если необходимо, например, если мы хотим обрабатывать случаи MacDonald и McFry, то регулярное выражение становится: (?<=\b(?:mc|mac)?)[a-zA-Z]

string input = "o'reilly, m'grego, d'angelo, macdonald's, mcfry";
input = Regex.Replace(input.ToLower(), @"(?<=\b(?:mc|mac)?)[a-zA-Z]", m => m.Value.ToUpper());
// input = O'Reilly, M'Grego, D'Angelo, MacDonald'S, McFry

Если нам нужно обрабатывать больше префиксов, нам нужно только изменить группу (?:mc|mac), например, чтобы добавить французские префиксы du, de: (?:mc|mac|du|de).

Наконец, мы можем понять, что это регулярное выражение также будет соответствовать случаю MacDonald'S для последнего 's, поэтому нам нужно обработать его в регулярном выражении с отрицательным внешним видом (?<!'s\b). В конце мы имеем:

string input = "o'reilly, m'grego, d'angelo, macdonald's, mcfry";
input = Regex.Replace(input.ToLower(), @"(?<=\b(?:mc|mac)?)[a-zA-Z](?<!'s\b)", m => m.Value.ToUpper());
// input = O'Reilly, M'Grego, D'Angelo, MacDonald's, McFry
12
ответ дан polkduran 26 August 2018 в 04:47
поделиться
String test = "HELLO HOW ARE YOU";
string s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(test);

Вышеприведенный код не работает .....

, поэтому поставьте ниже код путем преобразования в нижний, затем примените функцию

String test = "HELLO HOW ARE YOU";
string s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(test.ToLower());
30
ответ дан takrl 26 August 2018 в 04:47
поделиться

Я использую свой собственный метод, чтобы получить это исправление:

Например, фраза: «hello world. hello this is the stackoverflow world». будет «Hello World. Hello This Is The Stackoverflow World». Regex \ b (начало слова) \ w (первый символ слова) сделает трюк.

/// <summary>
/// Makes each first letter of a word uppercase. The rest will be lowercase
/// </summary>
/// <param name="Phrase"></param>
/// <returns></returns>
public static string FormatWordsWithFirstCapital(string Phrase)
{
     MatchCollection Matches = Regex.Matches(Phrase, "\\b\\w");
     Phrase = Phrase.ToLower();
     foreach (Match Match in Matches)
         Phrase = Phrase.Remove(Match.Index, 1).Insert(Match.Index, Match.Value.ToUpper());

     return Phrase;
}
3
ответ дан Ton Snoei 26 August 2018 в 04:47
поделиться

Мне нравится этот путь:

using System.Globalization;
...
TextInfo myTi = new CultureInfo("en-Us",false).TextInfo;
string raw = "THIS IS ALL CAPS";
string firstCapOnly = myTi.ToTitleCase(raw.ToLower());

Поднят из этой статьи MSDN .

0
ответ дан TrentVB 26 August 2018 в 04:47
поделиться

Предложения по использованию ToTitleCase не будут работать для строк, которые все в верхнем регистре. Таким образом, вам придется вызвать ToUpper на первом символе и ToLower на оставшиеся символы.

2
ответ дан Tundey 26 August 2018 в 04:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: