|
Помогите написать регулярное выражение 🠗 (Волшебник 18.11.2024 08:32) | ☑ | ||
---|---|---|---|---|
0
Грю
15.11.24
✎
18:30
|
Решил попробовать изучить что-то новое, регулярные выражения.
Хочу найти слово целиком с помощью регулярки, но у меня что-то не получается. Вот эта: \bТутСлово\b работает на всем, кроме слова .net Например, оно присутствует в строке: Full-Stack Developer (Angular, .net Core, SQL) Как бы сделать? Кто знает? |
|||
1
realptrm
15.11.24
✎
06:44
|
\.net
или (?i)\.net если не важен регистр |
|||
2
Грю
15.11.24
✎
07:06
|
(1) Нужно слово целиком. Иначе найдет всякие .network, а это не нужно.
|
|||
3
vbus
15.11.24
✎
07:28
|
\.net
https://regex101.com/r/hsnceF/1 |
|||
4
osa1C
15.11.24
✎
07:49
|
(2) Пробел в конце поставь, а если серьезно, то \b.net\b
\b граница слова, например: \bsun\b — найдет sun, но не sunny Тут только не знаю как на точку отреагирует. По идее точка - это любой символ, но в теге \b \b может будет считать за символ "точка" https://www.about1c.ru/v83/language-reference/regexp |
|||
5
dmt
15.11.24
✎
07:41
|
(0)
Для поиска всех слов, содержащих ".net" целиком, можно использовать следующее регулярное выражение: ``` \b\w*\.net\w*\b ``` ### Объяснение: - `\b` — обозначает границу слова. - `\w*` — соответствует любому количеству букв, цифр или символов подчеркивания (`_`) перед `.net`. - `\.net` — ищет точную последовательность символов `.net`, где точка экранируется символом обратного слэша (`\`), чтобы избежать ее трактовки как специального символа. - `\w*` — соответствует любому количеству букв, цифр или символов подчеркивания после `.net`. - Вторая граница слова `\b` завершает поиск. Таким образом, данное регулярное выражение найдет все слова, содержащие ".net". |
|||
6
dmt
15.11.24
✎
07:44
|
Для поиска слова ".net", которое отделено пробелами или знаками препинания, можно использовать границы слова (`\b`). Вот пример регулярного выражения:
```python import re pattern = r'\b\.net\b' def contains_word_dot_net(string): return bool(re.search(pattern, string)) # Примеры использования print(contains_word_dot_net("example .net is great")) # True print(contains_word_dot_net("example.net is great")) # False print(contains_word_dot_net("no match here")) # False ``` ### Объяснение: - `r'\b\.net\b'`: Регулярное выражение включает в себя границы слова (`\b`), которые гарантируют, что найденное совпадение является отдельным словом. Внутри границ находится шаблон `\.` и `net`, где точка экранирована символом обратного слэша (`\`), чтобы она воспринималась буквально. - Функция `re.search()` ищет первое совпадение шаблона в строке. Если совпадение найдено, возвращается объект совпадения, иначе — `None`. - `bool(re.search(...))` преобразует результат поиска в булево значение: `True`, если совпадение найдено, и `False` в противном случае. Такое регулярное выражение гарантирует, что найдётся именно отдельное слово ".net", а не часть другого слова или строки. |
|||
7
AlexKimp
15.11.24
✎
07:44
|
(2) например? ваще не врубаюсь. .net непременно в конце или после t любой символ, кроме a-zA-Z?
|
|||
8
toypaul
гуру
15.11.24
✎
08:09
|
(7) с обеих сторон пробел или другой разделитель
|
|||
9
toypaul
гуру
15.11.24
✎
08:10
|
+ (8) начало и конец строки тоже разделитель
|
|||
10
Грю
15.11.24
✎
08:51
|
(3) Находит часть слова .network: https://regex101.com/r/RUZk7a/1
|
|||
11
Грю
15.11.24
✎
08:41
|
(4) Не работает: https://regex101.com/r/6LRdPW/1
|
|||
12
Грю
15.11.24
✎
08:43
|
(6) Не работает: https://regex101.com/r/hLmS1o/1
|
|||
13
Грю
15.11.24
✎
08:58
|
(7) Да.
.net - это должно быть законченное слово, не .network и не zaicev.net Перед ним и после него не должно быть сразу букв и цифр. Вот как (4) про sun правильно писал, только вместо sun должно быть .net \bsun\b — найдет sun, но не sunny |
|||
14
osa1C
15.11.24
✎
09:15
|
||||
15
osa1C
15.11.24
✎
09:23
|
(13) Пробел в конце сработал, .network и zaicev.net не нашел,
а .net нашел |
|||
16
hiddi
15.11.24
✎
09:26
|
\.net\b
|
|||
17
osa1C
15.11.24
✎
09:27
|
(16) Вот, кстати!!! Работает
|
|||
18
vbus
15.11.24
✎
09:35
|
||||
19
hiddi
15.11.24
✎
09:30
|
(16) сорри \B\.net\b
|
|||
20
osa1C
15.11.24
✎
09:42
|
\B\.net\b - работает
\b\.net\b - не работает В чем различие между БОЛЬШОЙ "B" и маленькой "b"? |
|||
21
hiddi
15.11.24
✎
09:53
|
(20) \B - non-word boundary
|
|||
22
hiddi
15.11.24
✎
10:28
|
(12) вот и верь чатужпт )
|
|||
23
Timon1405
15.11.24
✎
14:52
|
(19) найдет ".net" в "..net" а не должно
|
|||
24
Garykom
гуру
15.11.24
✎
15:16
|
(5) чатгпт?
кстати для подобных задач он хорош на практике надо подумать как задавать множество (разделитель или признак) начала слова и его конца пример "тут разная хрень \r\n.net, а потом хрень продолжается" |
|||
25
Волшебник
15.11.24
✎
15:20
|
||||
26
Грю
15.11.24
✎
16:29
|
(15) А если там будет не пробел, а конец строки?
|
|||
27
Грю
15.11.24
✎
16:33
|
(18) Неплохо. Но первое \b лишнее, и (\s|$) тоже лишнее.
|
|||
28
Грю
15.11.24
✎
16:40
|
(25) Не работает на первом .net https://regex101.com/r/xXN1vj/1
|
|||
29
Грю
15.11.24
✎
16:54
|
(19) Это неочевидно, но оказалось, что работает. Прикольно.
(23) А может, пусть найдет? Вроде, ничего страшного. Скажу что так и было задумано. И такой случай маловероятен, если только опечатка возникнет. |
|||
30
Волшебник
15.11.24
✎
17:05
|
(28) и хрен с ним. Первое .net искать не надо
|
|||
31
hiddi
15.11.24
✎
17:27
|
(23) ну, добавь еще (?<!\.)\B\.net\b
|
|||
32
Грю
15.11.24
✎
18:17
|
(30) Надо, потому что строка может быть разбита на подстроки, и .net в середине строки может оказаться в начале подстроки. Это HTML, из которого был извлечен текст. Например, вот такой может быть:
Full-Stack Developer (<span>Angular</span>, <span>.net Core</span>) |
|||
33
Грю
15.11.24
✎
18:22
|
Итого, этот вариант вроде полностью рабочий: (^|\s)\.net\b
Этот подходит, но с натяжкой: \B\.net\b Два решения сделали, молодцы! |
|||
34
Грю
15.11.24
✎
18:41
|
Нужно усложнить задачу. Регулярка должна быть универсальная. Если вместо .net будет другое слово, то она тоже должна работать. Например, нужно найти много разных подстрок, такие как: cat, dog, \.net, java, angular, и т.д.
Подставляем их в ту же регулярку, и она их находит в строке. Остается тогда только этот вариант: (^|\s)\.net\b Потому что \B\.net\b перестает работать ЗЫ: .net можно заранее задать с обратным слешем, чтобы проще было. |
|||
35
novichok79
15.11.24
✎
18:45
|
pattern:=strings.Join([]string{`(^|\s)`, regexp.QuoteMeta(".net"), `\b`}, "")
re, err := regexp.Compile(pattern) |
|||
36
Грю
15.11.24
✎
18:46
|
Короче, сделал проще! Вместо .net в поиск подставляю просто net, и все работает нормально с самой простой регуляркой: \bТутСлово\b
Ура! |
|||
37
Грю
15.11.24
✎
18:49
|
(35) Отлично, прям все предусмотрено. Что это за язык? Питон или Го какой-нибудь?
|
|||
38
novichok79
15.11.24
✎
18:50
|
(37) прошел собес в ВК когда-то, где надо было писать регулярки на память (слава боженьке без positive, negative look-ahead, behind) без regex101.com.
обращайтесь. |
|||
39
Грю
15.11.24
✎
18:52
|
Сам нашел, Го оказывается:
![]() |
|||
40
novichok79
15.11.24
✎
18:54
|
(39) да, это Golang. я сейчас работаю старшим golang инженером.
в остальных ЯП была бы похожая конструкция, зависит от стандарта поддерживаемых регулярок. в golang нету тех самых positive negative look-ahead, так как это может повесить программу. а в Java есть и там можно регуляркой повесить сервис. |
|||
41
Грю
15.11.24
✎
19:06
|
(40) Круто! Сколько платят?
|
|||
42
novichok79
15.11.24
✎
19:50
|
(41) много, от 500 до 550 тыр на руки.
|
|||
43
Грю
15.11.24
✎
19:53
|
(42) Реально, много. Вот это я понимаю, хорошая работа.
|
|||
44
novichok79
15.11.24
✎
19:57
|
(43) надо уметь себя продать.
|
|||
45
osa1C
15.11.24
✎
20:11
|
(36) прикольно. Я тебе это ещё в (4) писал
|
|||
46
Грю
16.11.24
✎
00:16
|
(45) ты предлагал убрать точку? Пардонище, что-то не видел.
|
|||
47
osa1C
16.11.24
✎
04:46
|
(46) Убрать не предлагал, но про то, что из-за точки конструкция непонятно как себя поведет писал
|
|||
48
Грю
16.11.24
✎
07:23
|
(47) Я из-за нее создавал эту тему.
|
|||
49
Грю
17.11.24
✎
01:10
|
Друзья, я тут подумал, и решил что вариант (^|\s)\.net\b не подходит, потому что вместе с .net он находит еще и пробел, который стоит перед точкой. Это не будет работать если рядом две искомых подстроки.
Вот такой вариант более универсальный и правильный: (?<=\W|^)\.net(?=\W|$) https://regex101.com/r/sLpLVa/1 Всем спасибо, сам разобрался. Темку можно закрыть. |
|||
50
Кирпич
16.11.24
✎
22:09
|
(49) в 1с такое не прокатит. И в других тоже не во всех. В питоне кажись и в go фокуса с просмотром вперед и назад нету.
|
|||
51
Грю
17.11.24
✎
01:07
|
(50) Без фокуса тогда как сделать можно? Циклом если только.
|
|||
52
Грю
18.11.24
✎
06:15
|
Отменяется требование найти .net
Достаточно просто net Как оказалось, некоторые рукожопы пишут . Net через пробел или вообще Dot Net! А иногда встречается слово ASP.NET Так что снова упрощаю задачу до проще некуда. Всем спасибо, темку можно грохнуть. |
|||
53
Волшебник
18.11.24
✎
08:53
|
(52) работу ищешь? изучай 1С, тогда работа сама тебя найдёт
|
|||
54
Грю
18.11.24
✎
17:27
|
Искал, но сейчас это нереально, забил до весны. К концу года работодатели снизили найм, многие вакансии планируют закрыть только в январе, вообще не торопятся, отвечают по месяцу, соискателей тысячи на одно место. Вот реальный пример:
![]() А 1С я и так хорошо знаю, 15+ лет опыта за плечами. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |