Regex: Полоса не числовая альфа или пунктуация

Конечно, можно запустить функцию async без явного использования asyncio. В конце концов, asyncio написан на Python, так что все, что он делает, вы можете сделать тоже (хотя иногда вам могут понадобиться другие модули, такие как selectors или threading, если вы собираетесь одновременно ждать внешних событий или выполнять несколько другой код).

В этом случае, поскольку ваша функция не имеет внутри await точек, для этого требуется всего лишь одно нажатие. Вы нажимаете сопрограмму send ing None в нее.

>>> foo().send(None)
Hello!
Hello!
...

Конечно, если ваша функция (сопрограмма) имела внутри yield выражения, она приостанавливала выполнение на каждом yieldcoro.send(value) или next(gen)), но вы уже знаете, что если вы знаете, как работают генераторы.

import types

@types.coroutine
def bar():
    to_print = yield 'What should I print?'
    print('Result is', to_print)
    to_return = yield 'And what should I return?'
    return to_return

>>> b = bar()
>>> next(b)
'What should I print?'
>>> b.send('Whatever you want')
Result is Whatever you want
'And what should I return?'
>>> b.send(85)
Traceback...
StopIteration: 85

Теперь, если ваша функция имел внутри await выражения, он приостанавливался при оценке каждого из них.

async def baz():
    first_bar, second_bar = bar(), bar()
    print('Sum of two bars is', await first_bar + await second_bar)
    return 'nothing important'

>>> t = baz()
>>> t.send(None)
'What should I print?'
>>> t.send('something')
Result is something
'And what should I return?'
>>> t.send(35)
'What should I print?'
>>> t.send('something else')
Result is something else
'And what should I return?'
>>> t.send(21)
Sum of two bars is 56
Traceback...
StopIteration: nothing important

Теперь все эти .send s начинают утомиться. Было бы неплохо получить их полуавтоматически.

import random, string

def run_until_complete(t):
    prompt = t.send(None)
    try:
        while True:
            if prompt == 'What should I print?':
                prompt = t.send(random.choice(string.ascii_uppercase))
            elif prompt == 'And what should I return?':
                prompt = t.send(random.randint(10, 50))
            else:
                raise ValueError(prompt)
    except StopIteration as exc:
        print(t.__name__, 'returned', exc.value)
        t.close()

>>> run_until_complete(baz())
Result is B
Result is M
Sum of two bars is 56
baz returned nothing important

Поздравляем, вы только что написали свой первый цикл событий! (Не ожидал, что это произойдет?) Конечно, это ужасно примитивно: он знает только, как обрабатывать два типа запросов, он не позволяет t создавать дополнительные сопрограммы, которые работают одновременно с ним , и он подделывает события генератором random.

(На самом деле, если вы хотите философски: что мы сделали выше этого вручную, могли бы также называться событием loop: Python REPL выводит запросы на консольное окно, и он полагался на вас, чтобы предоставить события, набрав в него t.send(whatever) .:)

asyncio - это просто чрезвычайно обобщенный вариант вышеприведенного : приглашения заменяются на Future s, несколько сопрограмм хранятся в очередях, поэтому каждый из них в конце концов переходит в свою очередь, а события намного богаче и включают в себя связь между сетями / сокетами, чтение / запись файловой системы, обработку сигналов, исполнение и т. д. Но основная идея все та же: вы хватаете некоторые сопрограммы, жонглируете ими в воздухе, направляя Фьючерсы от одного к другому, пока все не поднимете StopIteration. Когда все сопрограммы не имеют ничего общего, вы отправляетесь во внешний мир и захватываете некоторые дополнительные события, чтобы они могли пережевывать и продолжать.

Надеюсь, теперь все намного понятнее. : -)

25
задан Tedd 16 June 2010 в 02:29
поделиться

3 ответа

preg_replace("/[^a-zA-Z0-9\s\p{P}]/", "", $str);

Пример:

php > echo preg_replace("/[^a-zA-Z0-9\s\p{P}]/", "", "⟺f✆oo☃. ba⟗r!");
foo. bar!

\p{P} соответствует всем символам пунктуации Unicode (см. Свойства символов Unicode ). Если вы хотите разрешить только определенные знаки препинания, просто добавьте их в класс отрицанных символов. Например:

preg_replace("/[^a-zA-Z0-9\s.?!]/", "", $str);
31
ответ дан Matthew Flaschen 28 November 2019 в 21:32
поделиться

Вам нужно будет перечислить пунктуацию в явном виде, так как для этого нет сокращения (например, \s - сокращение для символов пробела).

preg_replace('/[^a-zA-Z0-9\s\-=+\|!@#$%^&*()`~\[\]{};:\'",<.>\/?]/', '', $str);
3
ответ дан cletus 28 November 2019 в 21:32
поделиться
$str = trim($str);
$str = trim($str, "\x00..\x1F");
$str = str_replace(array( "&quot;","&#039;","&amp;","&lt;","&gt;"),' ',$str);
$str = preg_replace('/[^0-9a-zA-Z-]/', ' ', $str);
$str = preg_replace('/\s\s+/', ' ', $str); 
$str = trim($str);
$str = preg_replace('/[ ]/', '-', $str);

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

0
ответ дан Yuck 28 November 2019 в 21:32
поделиться
Другие вопросы по тегам:

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