Как упоминал Эрик Венделин, вы можете сделать что-то вроде этого:
str1 = "pattern"
var re = new RegExp(str1, "g");
"pattern matching .".replace(re, "regex");
Это дает "regex matching ."
. Однако он будет терпеть неудачу, если str1 - "."
. Вы ожидаете, что результат будет "pattern matching regex"
, заменив период на "regex"
, но он окажется ...
regexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregex
Это потому, что, хотя "."
a String, в конструкторе RegExp он по-прежнему интерпретируется как регулярное выражение, что означает любой символ нестрочного разрыва, означающий каждый символ в строке. Для этой цели может быть полезной следующая функция:
RegExp.quote = function(str) {
return str.replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");
};
. Тогда вы можете сделать:
str1 = "."
var re = new RegExp(RegExp.quote(str1), "g");
"pattern matching .".replace(re, "regex");
, уступая "pattern matching regex"
.
Если вы не можете использовать timeout
по какой-либо причине (одна из которых является слишком старой версией python), вот мое решение, которое работает с любой версией python:
subprocess
Я использую подпроцесс python, работающий с -u
(небуферизованный):
передатчик.py: (тестовая программа, которая печатает «hello xx» каждую 1/10-ю секунду)
blockquote>import time i=0 while True: print("hello {}".format(i)) i += 1 time.sleep(0.1)
самой программы (тайм-аут установлен на 1,5 секунды):
blockquote>import subprocess,threading,time def timeout(p,timeout): time.sleep(timeout) p.kill() p = subprocess.Popen(["python","-u","transmitter.py"],stdout=subprocess.PIPE,stderr=subprocess.STDOUT) t = threading.Thread(target=timeout,args=(p,1.5)) t.start() output = [] for line in p.stdout: output.append(line.decode()) t.join() print("".join(output))
В конце, после таймаута, программа печатает:
hello 0 hello 1 hello 2 hello 3 hello 4 hello 5 hello 6 hello 7 hello 8 hello 9 hello 10 hello 11 hello 12 hello 13 hello 14
Вам нужно использовать Popen и subprocess.PIPE , чтобы поймать выход процесса, когда истекает время ожидания. В частности, Popen.communicate - это то, что вам нужно. Вот пример
proc = subprocess.Popen(["ping", "192.168.1.1"],
stdout=subprocess.PIPE)
try:
output, error = proc.communicate(timeout=2)
except subprocess.TimeoutExpired:
proc.kill()
output, error = proc.communicate()
print(output)
print(error)
. Это будет печатать выход процесса до истечения времени ожидания.