Pandas .str.relace и нечувствительность к регистру - PullRequest
0 голосов
/ 20 декабря 2018

Создание замены без учета регистра не похоже на эффект в следующем примере (я хочу заменить мл. или мл. на г.р. ):

In [0]: pd.Series('Jr. eng').str.replace('jr.', 'jr', regex=False, case=False)
Out[0]: 0    Jr. eng

Почему?Что я недопонимаю?

1 Ответ

0 голосов
/ 20 декабря 2018

Аргумент case на самом деле удобен как альтернатива указанию flags=re.IGNORECASE.Это не имеет никакого отношения к замене, если замена не основана на регулярных выражениях.

Итак, когда regex=True, это ваш возможный выбор:

pd.Series('Jr. eng').str.replace(r'jr\.', 'jr', regex=True, case=False)
# pd.Series('Jr. eng').str.replace(r'jr\.', 'jr', case=False)

0    jr eng
dtype: object

Или,

pd.Series('Jr. eng').str.replace(r'jr\.', 'jr', regex=True, flags=re.IGNORECASE)
# pd.Series('Jr. eng').str.replace(r'jr\.', 'jr', flags=re.IGNORECASE)

0    jr eng
dtype: object

Вы также можете получить дерзкий и обойти оба аргумента ключевых слов с помощьювключение флага нечувствительности к регистру как части шаблона как ?i.См.

pd.Series('Jr. eng').str.replace(r'(?i)jr\.', 'jr')
0    jr eng
dtype: object

Примечание
Вам потребуется экранировать период \. в режиме регулярных выражений, поскольку неэкранированная точка является метасимволом с другим значением(соответствует любому персонажу).Если вы хотите динамически экранировать мета-символы в шаблонах, вы можете использовать re.escape.

Для получения дополнительной информации о флагах и якорях см. этот разделдокументы и re HOWTO .


Исходный код ясно, что аргумент "case" игнорируется, если regex=False.См.

# Check whether repl is valid (GH 13438, GH 15055)
if not (is_string_like(repl) or callable(repl)):
    raise TypeError("repl must be a string or callable")

is_compiled_re = is_re(pat)
if regex:
    if is_compiled_re:
        if (case is not None) or (flags != 0):
            raise ValueError("case and flags cannot be set"
                             " when pat is a compiled regex")
    else:
        # not a compiled regex
        # set default case
        if case is None:
            case = True

        # add case flag, if provided
        if case is False:
            flags |= re.IGNORECASE
    if is_compiled_re or len(pat) > 1 or flags or callable(repl):
        n = n if n >= 0 else 0
        compiled = re.compile(pat, flags=flags)
        f = lambda x: compiled.sub(repl=repl, string=x, count=n)
    else:
        f = lambda x: x.replace(pat, repl, n)

Вы можете видеть, что аргумент case проверяется только внутри оператора if.

IOW, единственный способ - обеспечить regex=True так что замена основана на регулярных выражениях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...