Найти цифру и добавить числовое слово в строку с помощью регулярных выражений в Python - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь найти любые цифры входной строки и затем добавить английское слово для каждой цифры в конце строки.Однако мой код выдает ошибку can't assign to function call.

import re

def to_eng(s):

    words = {"0":"zero","1":"one","2":"two","3":"three","4":"four","5":"five","6":"six","7":"seven","8":"eight","9":"nine"}
    k = re.findall(r"[0-9]",s)
    for i in k:
        w = words.items(), key=lambda x: x[0]
    print(s + w)

s = "I want to buy 17 cars."
to_eng(s)

Я хотел бы, чтобы мой вывод был: I want to buy 17 cars. one seven

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Я бы сделал это следующим образом:

import re
s = "I want to buy 17 cars."
words = {"0":"zero","1":"one","2":"two","3":"three","4":"four","5":"five","6":"six","7":"seven","8":"eight","9":"nine"}
k = re.findall(r"[0-9]",s)
w = ' '.join([words[i] for i in k])
print(w) #one seven

В этом решении используется так называемое понимание list, что позволяет получить более сжатый код, чем при использовании цикла for.

0 голосов
/ 18 февраля 2019

Подсказка: здесь чего-то не хватает (может быть, вызов функции?)

for i in k:
    w = words.items(), key=lambda x: x[0]
    #  ^                                 ^
print(s + w)

Но вы можете изменить его на:

def to_eng(s):
    words = {"0":"zero","1":"one","2":"two","3":"three","4":"four","5":"five","6":"six","7":"seven","8":"eight","9":"nine"}
    rx = re.compile(r'\d')
    for m in rx.finditer(s):
        s = s + " " + words[m.group(0)]
    print(s)

Уступая

I want to buy 17 cars. one seven


Или - еще лучше - использовать список в целом:
def to_eng(s):
    words = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"]
    rx = re.compile(r'\d')

    return s + " ".join(words[int(m.group(0))] for m in rx.finditer(s))


Что касается вашего последнего вопроса - вставка скобок с английскими словами - вам нужно составить функцию замены:
def to_eng(s):
    words = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"]
    rx = re.compile(r'\d+')

    def repl(digits):
        return digits.group(0) + " (" + " ".join(words[int(x)] for x in digits.group(0)) + ")"

    return rx.sub(repl, s)

Это приводит к примеру строки:

I want to buy 17 (one seven) cars.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...