Regex - сопоставить шаблон, который окружен либо незнаковым, либо началом или концом строки [дубликат]

Это помогает мне:

private func urlRequestWithComponentsForUploadMultipleImages(urlString:String, parameters:Dictionary<String, String>, imagesData:[Data], imageName: String) -> (URLRequestConvertible , Data) {

    // create url request to send
    var mutableURLRequest = URLRequest(url: NSURL(string: urlString)! as URL)

    mutableURLRequest.httpMethod = Alamofire.HTTPMethod.post.rawValue
    let boundaryConstant = "myRandomBoundary12345";
    let contentType = "multipart/form-data;boundary="+boundaryConstant
    mutableURLRequest.setValue(contentType, forHTTPHeaderField: "Content-Type")


    // create upload data to send
    var uploadData = Data()
    // add image
    for data in imagesData {
        uploadData.append("\r\n--\(boundaryConstant)\r\n".data(using: String.Encoding.utf8)!)
        uploadData.append("Content-Disposition: form-data; name=\"\(imageName)\"; filename=\"\(Date().timeIntervalSince1970).jpeg\"\r\n".data(using: String.Encoding.utf8)!)
        uploadData.append("Content-Type: image/jpeg\r\n\r\n".data(using: String.Encoding.utf8)!)
        uploadData.append(data)
    }
    // add parameters
    for (key, value) in parameters {
        uploadData.append("\r\n--\(boundaryConstant)\r\n".data(using: String.Encoding.utf8)!)
        uploadData.append("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n\(value)".data(using: String.Encoding.utf8)!)
    }
    uploadData.append("\r\n--\(boundaryConstant)--\r\n".data(using: String.Encoding.utf8)!)
    print("upload",parameters)
    return (mutableURLRequest , uploadData)
}
18
задан Bryce Thomas 20 August 2010 в 17:40
поделиться

6 ответов

>>> import re
>>> s="four digits 1234 five digits 56789 six digits 012345"
>>> re.findall(r"\D(\d{5})\D", s)
['56789']

, если они могут произойти в самом начале или в самом конце, проще вставить строку, чем беспорядок со специальными случаями

>>> re.findall(r"\D(\d{5})\D", " "+s+" ")
33
ответ дан John La Rooy 22 August 2018 в 00:37
поделиться
  • 1
    В ответе я выделил разницу между \ D и \ b в regex. – igaurav 29 September 2014 в 19:57
  • 2
    re.findall(r"\D(\d{5})\D","15/05/2018 a8711 43160") дает [ ]. Что дает? – Aetos 8 June 2018 в 10:09
  • 3
    @Aetos. В ответ говорится, что вам нужно будет заполнить эту строку ввода. Lookahead и заглянуть сзади могут значительно снизить производительность вашего регулярного выражения. Мне было бы интересно узнать, что вы найдете. – John La Rooy 9 June 2018 в 21:45

Вероятно, вы хотите совместить не цифру до и после строки из 5 цифр, например [^0-9]([0-9]{5})[^0-9]. Затем вы можете захватить внутреннюю группу (нужная строка).

1
ответ дан Bob 22 August 2018 в 00:37
поделиться
  • 1
    который не работает с "12345" так как начало строки и конец строки не совпадают с [^ 0-9] – Xavier Combelle 28 March 2017 в 11:40

Без заполнения строки для начала и конца конкретного случая, как в ответе John La Rooy , можно использовать негативы lookahead и lookbehind для обработки обоих случаев с одним регулярным выражением

>>> import re
>>> s = "88888 999999 3333 aaa 12345 hfsjkq 98765"
>>> re.findall(r"(?<!\d)\d{5}(?!\d)", s)
['88888', '12345', '98765']
8
ответ дан Community 22 August 2018 в 00:37
поделиться
  • 1
    Ваш ответ правильный, тот, который выбран в качестве решения, не является – Aetos 8 June 2018 в 10:11

Примечание. Существует проблема с использованием \D, поскольку \D соответствует любому символу, который не является цифрой, вместо этого используйте \b. \b важен здесь, потому что он соответствует границе слова, но только в конце или в начале слова.

import re  

input = "four digits 1234 five digits 56789 six digits 01234,56789,01234"


re.findall(r"\b\d{5}\b", input)  

result : ['56789', '01234', '56789', '01234']

, но если вы используете re.findall (r "\ D (\ d {5}) \ D", s) вывод: ['56789', '01234'] \ D не может для обработки запятой или любых введенных цифр.

\ b является важной частью здесь, она соответствует пустой строке, но только в конце или в начале слова.

Дополнительная документация: https://docs.python.org/2/library/re.html

Подробнее Разъяснение использования \D vs \b:

В этом примере используется \D, но он не фиксирует все пять цифр.

В этом примере использует \b при захвате всех пятизначных цифр.

Приветствия

3
ответ дан igaurav 22 August 2018 в 00:37
поделиться
  • 1
    Я изменил ваше регулярное выражение, чтобы использовать там необработанную строку, поскольку \b в остальном является допустимым символом escape в строках. Проблема с этим ответом заключается в том, что он не работает, если другие альфа-символы соединены с строкой цифр, например. & Quot; 56789a & Quot; – John La Rooy 29 September 2014 в 21:05
  • 2
    @gnibbler нигде не может справиться с этим! – igaurav 29 September 2014 в 21:13
  • 3
    Вы имеете в виду, что \D не обрабатывает начало или конец строк? Я имел в виду это в своем ответе. – John La Rooy 29 September 2014 в 21:15
  • 4
    @gnibbler, я имею в виду, что он не обрабатывает & quot; 56789a & quot; – igaurav 29 September 2014 в 21:25
  • 5
    & Quot; 56789a & Quot; согласован как "56789" используя \D – John La Rooy 29 September 2014 в 21:28

Вы можете попробовать

\D\d{5}\D

или, может быть,

\b\d{5}\b

Я не уверен, что python обрабатывает контуры строк и пробелы там.

Я считаю, что ^\d{5}$ не сработает для вас, так как вы, вероятно, захотите получить числа, которые находятся где-то внутри другого текста.

11
ответ дан sth 22 August 2018 в 00:37
поделиться
  • 1
    спасибо, на самом деле, путают с решением '\ b \ d {5} \ b' и '^ [0-9] {5} $', спасибо за то, что он позже, затем создайте выражение как строку, это то, что мне нужно. – zhihong 24 March 2017 в 13:56
  • 2
    этот ответ не работает в начале и в строке. Например, он не соответствует & quot; 12345 & quot; – Xavier Combelle 28 March 2017 в 11:37
  • 3
    первое регулярное выражение не работает с "12345" а второй - с "12345a" – Xavier Combelle 28 March 2017 в 11:38
[g0] Очень простой способ - сопоставить все группы цифр, например, с помощью [f1], а затем пропустить каждое совпадение, длина которого не превышает пяти символов, при обработке результатов. [/g0]
11
ответ дан sth 4 November 2018 в 22:36
поделиться
  • 1
    спасибо, на самом деле, перепутали с решениями '\ b \ d {5} \ b' и '^ [0-9] {5} $', спасибо за указание, позже создайте выражение как строку это то, что мне нужно – zhihong 24 March 2017 в 13:56
  • 2
    этот ответ не работает в начале и в строке. Например, он не соответствует & quot; 12345 & quot; – Xavier Combelle 28 March 2017 в 11:37
Другие вопросы по тегам:

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