Конечно, можно запустить функцию async
без явного использования asyncio
. В конце концов, asyncio
написан на Python, так что все, что он делает, вы можете сделать тоже (хотя иногда вам могут понадобиться другие модули, такие как selectors
или threading
, если вы собираетесь одновременно ждать внешних событий или выполнять несколько другой код).
В этом случае, поскольку ваша функция не имеет внутри await
точек, для этого требуется всего лишь одно нажатие. Вы нажимаете сопрограмму send
ing None
в нее.
>>> foo().send(None)
Hello!
Hello!
...
Конечно, если ваша функция (сопрограмма) имела внутри yield
выражения, она приостанавливала выполнение на каждом yield
(и coro.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
. Когда все сопрограммы не имеют ничего общего, вы отправляетесь во внешний мир и захватываете некоторые дополнительные события, чтобы они могли пережевывать и продолжать.
Надеюсь, теперь все намного понятнее. : -)
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);
Вам нужно будет перечислить пунктуацию в явном виде, так как для этого нет сокращения (например, \s
- сокращение для символов пробела).
preg_replace('/[^a-zA-Z0-9\s\-=+\|!@#$%^&*()`~\[\]{};:\'",<.>\/?]/', '', $str);
$str = trim($str);
$str = trim($str, "\x00..\x1F");
$str = str_replace(array( ""","'","&","<",">"),' ',$str);
$str = preg_replace('/[^0-9a-zA-Z-]/', ' ', $str);
$str = preg_replace('/\s\s+/', ' ', $str);
$str = trim($str);
$str = preg_replace('/[ ]/', '-', $str);
Надеюсь, это поможет.